我有一个相当复杂的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__
,imp
和importlib
)。此外,如果我重命名Project/Build/Controllers
和Project/Build/UI
,它将会起作用,但考虑到这些文件结构可能的复杂性,我宁愿不再为所有内容添加唯一名称。
答案 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路径总是让我心痛。