相对导入:子包导入子包

时间:2018-10-10 16:54:39

标签: python python-import relative-path

目录结构:

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?目前,这只是一个空文件。

1 个答案:

答案 0 :(得分:1)

在使用python file.py python运行文件时,会查看包含file__init__.py的目录。这意味着您不能使用import package.modulefrom .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并没有非骇客的解决方案。