从父目录Python包进口(Python package import from parent di

2019-07-30 07:23发布

我有以下的源代码结构

/testapp/
/testapp/__init__.py
/testapp/testmsg.py
/testapp/sub/
/testapp/sub/__init__.py
/testapp/sub/testprinter.py

其中testmsg定义了下列常数:

MSG = "Test message"

sub/testprinter.py

import testmsg

print("The message is: {0}".format(testmsg.MSG))

但我发现了ImportError: No module named testmsg

应该不会是因为封装结构的工作? 我真的不希望在每个子模块扩展sys.path中,我甚至不希望使用相对导入。

我在做什么错在这里?

Answer 1:

这一切都取决于你运行的脚本上。 该脚本的路径将被自动添加到Python的搜索路径。

让它的结构如下:

TestApp/
TestApp/README
TestApp/LICENSE
TestApp/setup.py
TestApp/run_test.py
TestApp/testapp/__init__.py
TestApp/testapp/testmsg.py
TestApp/testapp/sub/
TestApp/testapp/sub/__init__.py
TestApp/testapp/sub/testprinter.py

然后运行TestApp/run_test.py 第一

from testapp.sub.testprinter import functest ; functest()

然后TestApp/testapp/sub/testprinter.py可以这样做:

from testapp.testmsg import MSG
print("The message is: {0}".format(testmsg.MSG))

更多很好的提示在这里 ;



Answer 2:

使用如下的相对进口

from .. import testmsg


Answer 3:

这个问题有答案 - 动态导入:

如何导入一个python文件的父目录

import sys
sys.path.append(path_to_parent)
import parent.file1

这里的东西我做进口任何东西。 当然,你得犹在复制这个脚本本地目录,导入它,并use所需的路径。

import sys
import os

# a function that can be used to import a python module from anywhere - even parent directories
def use(path):
    scriptDirectory = os.path.dirname(sys.argv[0])  # this is necessary to allow drag and drop (over the script) to work
    importPath = os.path.dirname(path)
    importModule = os.path.basename(path)
    sys.path.append(scriptDirectory+"\\"+importPath)        # Effing mess you have to go through to get python to import from a parent directory

    module = __import__(importModule)
    for attr in dir(module):
        if not attr.startswith('_'):
            __builtins__[attr] = getattr(module, attr)


文章来源: Python package import from parent directory