从第二个模块导入模块

时间:2018-02-25 01:58:03

标签: python

我正在开发包含少量子模块的小应用程序:

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

这解决了许多问题,但出于好奇,我的问题仍然存在。如何从父目录中的代码导入时从同一级别导入模块?

1 个答案:

答案 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 */

这样您的可执行文件就位于顶层,当您分发项目时,用户不必深入了解子文件夹。我发现这个答案非常有用:

Python Nesting Modules