python - 相对导入:子包导入子包
问题描述
目录结构:
root/
script.py
package/
__init__.py
module1.py
module2.py
在script.py
我需要从中导入一个方法module1.py
并运行它。
#contents of script.py
from package.module1 import func1
func1()
中的方法module1.py
需要来自 的方法module2.py
。
#contents of module1.py
from package.module2 import func2
def func1():
func2()
if __name__ == "__main__":
func1()
如果我直接运行,上面的代码就可以工作script.py
。但是,在某些情况下,我需要module1.py
直接运行crontab
,这就是问题所在。
当 cronjob 运行时,我收到一条错误消息,说func2
找不到。module1.py
如果我将导入修改为以下内容,我可以运行:
#contents of module1.py
from module2 import func2
def func1():
func2()
if __name__ == "__main__":
func1()
如果我添加一个else
语句,我可以使这两种情况都起作用,module1.py
但它看起来很老套:
#contents of module1.py
def func1():
func2()
if __name__ == "__main__":
from module2 import func2
func1()
else:
from package.module2 import func2
func1()
我怎样才能更蟒蛇地做到这一点?也许我需要以__init__.py
某种方式利用?目前只是一个空文件。
解决方案
使用python file.py
python运行文件时,不会查看包含file
for的目录__init__.py
。这意味着您不能使用import package.module
也不能from .module import x
导入。
解决这个问题的方法是告诉 python 它file.py
是包的一部分。这是通过使用-m
开关完成的:
python -m package.module1
所以你不必修复你的代码,你必须修复你的crontab
命令!
这就是说:我个人从不喜欢运行模块。我宁愿run_module1.py
在包外写一个脚本,它只包含:
from package import module1
module1.func1()
然后运行run_module1.py
而不是module1.py
直接运行。
我不认为有任何充分的理由想要module1.py
像你一样运行并期望它在你尝试过的没有 hacky 导入的情况下工作。AFAIK 对此没有非骇客的解决方案。
推荐阅读
- javascript - 直接在渲染函数中使用 React.forwardRef
- javascript - 性能和优化 - 引导模式太多
- c# - 在 C# 中将 NLTK 与 pythonnet 一起使用:生成器对象为空
- android - 如何将数组从一个活动(意图)发送到另一个?
- python - Matplotlib 在 imshow 图中居中/对齐刻度
- javascript - 如果 ajax 请求的内部值发生变化,如何向元素添加类?
- model-view-controller - 视图必须从哪里接收 mvc 中的数据
- sql-server - 找出同一个学生与不同组中有多少科目相关联
- r - 如何在 tic.R 中添加非失败的 lintr 检查
- pandas - 如何将 3 个数据帧与每个数据帧连接成顺序列