在git存储库的顶层,我具有以下文件结构:
miscellaneous Dockerfiles, readme, etc
Code/
training.py
data/
generate.py
tasksets.py
有时候,当我将generate
模块作为脚本运行时,我想从tasksets
模块中导入tasksets
模块,因此tasksets
包括以下导入: / p>
import generate
有时我想从tasksets
模块中导入training
模块,因此training
包含以下导入:
import tasksets
但是,此设置给我带来了问题。在运行tasksets
作为脚本时,generate
可以很好地导入tasksets
,但是在运行{{1}时,如果在tasksets
中导入training
会引发错误。 }作为脚本(我想是因为training
在默认路径中找不到training
作为脚本)。我尝试使用generate
文件,相对导入等方法查看其他所有StackOverflow问题和答案。目前,我的解决方法是在__init__.py
中使用以下几行:
tasksets
但这感觉不对(我的IDE也都不喜欢)。请有人解释一下如何使用正确的if __name__ == "__main__": import generate
else: from data import generate
文件分类和导入语句,以便我可以在将__init__.py
作为脚本运行时导入generate
,并在运行时导入tasksets
作为脚本运行tasksets
?
答案 0 :(得分:0)
您最好使用经典的Python模块/包体系结构。
projectname/
__init__.py
__main__.py
data/
__init__.py
generate.py
tasksets.py
要使用您的应用程序,请进入projectname/../
目录(上一级projectname/
)并运行python -m projectname
。这将执行projectname/__main__.py
。
在__main__.py
中,您将编写如下内容:
from projectname.data import generate
from projectname.data import tasksets
if __name__ == '__main__':
generate.foo()
tasksets.bar()
projectname.
开头)if __name__ == '__main__'
__main__.py
将是您的应用/脚本的唯一入口点。在任何其他文件中,您将使用相同的语法和路径来导入其他模块:
data/generate.py
:
from projectname.data import tasksets
def foo():
print('SPAM!')
tasksets.bar()
我不太喜欢的东西,但我不确定有人能拒绝它,
在您的projectname/__init__.py
文件中,您可以编写:
from projectname.data import generate
from projectname.data import tasksets
因此,您的两个子模块将被导入到主作用域__init__.py
中,因此您可以从该作用域中导入子模块,例如
data/generate.py
:
from projectname import generate
但是,我还是不太喜欢这种方式(因为显式比隐式更好。)
最后但并非最不重要
python projectname/__main__.py
命令,但我仍然建议使用python -m projectname
setup.py
文件,以在系统上“安装”您的应用程序,只需运行projectname
命令即可运行它。