目录结构:
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()
我该如何通过Python做到这一点?也许我需要以某种方式利用__init__.py
?目前,这只是一个空文件。
答案 0 :(得分:1)
在使用python file.py
python运行文件时,不会查看包含file
和__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
,并希望它在尝试时不会引入任何恶意的输入而工作。 AFAIK并没有非骇客的解决方案。