Python导入中的命名空间

时间:2015-04-06 23:48:56

标签: python

我有一个相当复杂的python构建项目,带有PyQT GUI界面。构建器应该接受项目列表的配置,这可能因用户而异,然后自定义所选项目的构建过程。因此,构建器项目的某些部分将使用要构建的项目(项目特定的UI元素和控制器文件)进行版本控制,其余部分位于构建器目录中。我遇到的问题是导入的命名空间重叠。例如:

构建器目录可能如下所示:

 Builder/
        Controllers/
            __init__.py
            BuilderController1.py
            BuilderController2.py
        UI/
            __init__.py
            BuilderUI_1.py
            BuilderUI_2.py
        .../
        __main__.py 

项目目录可能如下所示:

Project/
    Project_Files/
    Build/
        Controllers/
            __init__.py
            ProjController1.py
            ProjController2.py
        UI/
            __init__.py
            ProjUI_1.py
            ProjUI_2.py
        .../
        __init__.py
        Project_setup.py        

使用__main__.py中的代码,例如:

...
sys.path.append("../path/to/Project/Build")
projSetup = __import__("Project_setup)
projSetup.run()    
...

Project_setup.py中的代码,例如:

...
from Controllers.ProjController1 import TestControl1
from Controllers.ProjController2 import TestControl2


def run():
    registerStage(name = 'TestControl1', controller = TestControl1(mainApp.getController(), displayName='TestControl1'), displayName = 'Test Control Page 1', parent = None)
    registerStage(name = 'TestControl2', controller = TestControl2(mainApp.getController(), displayName='TestControl2'), displayName = 'Test Control Page 2', parent = None)
...

问题在于,每次运行__main__.py时,都会收到错误消息:

ImportError: No module named Controllers.ProjController1

似乎在搜索PYTHONPATH模块ProjController1时,解释器被搁置在Builder/Controllers中,然后停止向下看路径。

这是python中的合理行为吗?有没有一种方法可以获得避免这些问题的相同结果?

我尝试过使用各种类型的python导入(import__import__impimportlib)。此外,如果我重命名Project/Build/ControllersProject/Build/UI,它将会起作用,但考虑到这些文件结构可能的复杂性,我宁愿不再为所有内容添加唯一名称。

1 个答案:

答案 0 :(得分:2)

相对路径依赖于您当前的工作目录。请尝试以下sys路径追加:

import os
dir_ = os.path.dirname(__file__)
sys.path.append(os.path.join(dir_, "/path/to/Project/Build"))

制作包装然后通过完全限定的路径导入真的更好。在根项目目录中,放置一个文件setup.py,其内容类似于:

#!/usr/bin/env python
from setuptools import setup
from setuptools import find_packages

setup(
    name='Name',
    version='1.0',
    packages=find_packages(exclude=('tests',)),
    cmdclass={

    },
    package_data={

    },
)

然后像这样构建和安装包:

python setup.py build; python setup.py install

执行如下导入:

from project.hierarchy.module import Class

有关创建包的更多信息,请in the Python docs

相对导入和修改sys路径总是让我心痛。