我正在开发包含少量子模块的小应用程序:
src/
setup.py
myapp/
myGuiapp.py
modules/
__init__.py
editorGui.py
fileParser.py
modules / __ init __。py
from editorGui import editorWindow
from fileParser import parseMyFile
myGuiapp.py
from modules import editorWindow
from modules import parseMyFile
parseMyFile(parms)
editorWindow(self)
EditorGui.py
from fileParser import parseMyFile
# from .fileParser import parseMyFile
# from modules.fileParser import parseMyFile
fileParser(parms)
我想从myGuiapp.py调用我的EditorGui.py,但也可以自己运行它。 在这种情况下我应该如何设置相对导入?
如果在EditorGui.py中,我将设置:
from modules.fileParser import parseMyFile
>python editorGui.py
ModuleNotFoundError: No module named 'modules'
但是来自主应用
>python myGuiapp.py
好的!
如果在EditorGui.py中,我将设置:
from .fileParser import parseMyFile
>python EditorGui.py
ModuleNotFoundError: No module named '__main__.fileParser'; '__main__' is not a package
如果在EditorGui.py中,我将设置:
from fileParser import parseMyFile
>python editorGui.py
好的!
>python myGuiapp.py
ModuleNotFoundError: No module named 'fileParser'
我怎样才能使这两种工作和我在做错了?我想避免设置这个开发目录的ABSOLETE路径。 构建这样的app会有什么最pythonic和干净的方式?
修改 在@Diego Trazzi发布之后,我决定将我的EditorGui.py提升到这个级别:
src/
setup.py
myapp/
myGuiapp.py
editorGui.py
modules/
__init__.py
fileParser.py
这解决了许多问题,但出于好奇,我的问题仍然存在。如何从父目录中的代码导入时从同一级别导入模块?
答案 0 :(得分:2)
避免指定模块的相对路径您可以在路径中附加路径:
# yourfile.py
import sys
sys.path.insert(0, '/path/to/application/app/folder')
您也可以在运行命令的shell中指定它:
python [-bBdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | - ] [args]
https://docs.python.org/2/using/cmdline.html
理想情况下,您的项目应以所有
的方式构建package_name/
/* setup.py and other misc files */
package_name/
__init__.py
/* module files go here */
test/
/* tests go here */
这样您的可执行文件就位于顶层,当您分发项目时,用户不必深入了解子文件夹。我发现这个答案非常有用: