可以从不同位置调用脚本时如何编写导入语句?

Posted

技术标签:

【中文标题】可以从不同位置调用脚本时如何编写导入语句?【英文标题】:How to write import statement when the scripts can be called from different locations? 【发布时间】:2019-05-23 13:07:02 【问题描述】:

考虑以下目录结构:

project/ 
    scripts/
        a1.py
        a2.py
    start.py

start.py 依赖于a1.py,而a1.py 又使用一个名为some_func 的函数,该函数存在于a2.py 中。而且a1.py也是一个独立的脚本,可以独立调用。现在这产生了两种情况:

案例 1:(独立脚本) 我会按如下方式导入 some_func

from a2 import some_func

案例 2:(来自start.py

from scripts.a2 import some_func

我的问题:结合这两个用例的pythonic方式是什么?

可能的解决方案?:推荐还是不推荐?

if __name__ == "__main__":
    from a2 import some_func
elif __name__ == "start":
    from scripts.a2 import some_func

注意:我使用的是 python 3.x

【问题讨论】:

a1 中调用from a2 import some_func 和在start 中调用from a1 import some_func 有什么问题? 你可以在a1.py中使用相对导入,更多关于相对导入here 【参考方案1】:

Pythonic 方式是从您的代码创建一个包,然后在您的代码中使用包内引用:https://docs.python.org/3/tutorial/modules.html

from . import some_func  # from scripts in same folder
from .scripts import some_func  # from start.py

您还可以在打包并安装解决方案后使用绝对路径(来自包名称),例如:

# this will work from anywhere
from mypackage.scripts import some_func

【讨论】:

以上是关于可以从不同位置调用脚本时如何编写导入语句?的主要内容,如果未能解决你的问题,请参考以下文章

从plsql调用java时Oracle如何导入缺少的java类

如何编写一个mysql数据库脚本

SQL SERVER 2008 R2 数据库附加到 SQL server 2005,怎么整

如何在 QML 中编写条件导入语句?

从系统某处调用脚本时如何导入配置文件?

在 Pig 中使用 Python UDF 时,如何让 Hadoop 查找导入的 Python 模块?