gpt4 book ai didi

python - Python 导入中的命名空间

转载 作者:行者123 更新时间:2023-12-01 04:45:32 25 4
gpt4 key购买 nike

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

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

 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 ,它会起作用,但考虑到这些文件结构可能的复杂性,我宁愿不被困在提供唯一的给一切事物命名。

最佳答案

相对路径依赖于您当前的工作目录。对您的 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路径总是让我心痛。

关于python - Python 导入中的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29481477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com