从父目录导入Python包

时间:2012-07-09 10:44:39

标签: python import package importerror

我有以下源代码结构

/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,我甚至不想使用相对导入。

我在这里做错了什么?

5 个答案:

答案 0 :(得分:16)

这完全取决于您运行的脚本。该脚本的路径将自动添加到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))

更多有用的提示here;

答案 1 :(得分:10)

使用下面的相对导入

from .. import testmsg

答案 2 :(得分:5)

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

How to import a python file in a parent directory

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)

答案 3 :(得分:1)

对于仍然存在相同问题的人。这就是我的解决方法:

 public void pageloadstate() throws InterruptedException {

JavascriptExecutorjs = (JavascriptExecutor)driver;

Stringstates =null;

do{

states=js.executeScript("return document.readyState").toString();

Thread.sleep(3000);

System.out.println("pageloaded!!!: "+ states);}

while (states== "complete");

System.out.println("pageloaded sucessfully");

答案 4 :(得分:0)

试试这个:


import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from my_module import *