我正在尝试在 Windows 10 上的 python 3.11.6 中创建一个包,它具有访问各种代码模块的相对路径,首先,我认为基本打包可以工作,即只需放置一个空的顶层 init.py,并向每个目录添加一个类似的文件。这对我不起作用。
my_project/
__init__.py
src_1/
__init__.py
first.py
src_2/
__init__.py
second.py
如果我尝试从顶级目录执行 secondary.py,则会出现导入错误。 如果我使用所有 3 个目录设置 PYTHONPATH,我将得到 secondary.py 来成功访问 first.py
我不想使用环境变量,因为项目几乎肯定会移动,而且我不想为每次安装都配置它们。顺便说一句,我认为这就是打包的作用,首先运行顶级 init.py ,并且较低级别中的任何代码都应该能够从同级目录导入?
在我尝试实现相对路径时,顶层 init.py 包含:
import os
import sys
# Get the current directory where this __init__.py file is located
current_directory = os.path.dirname(os.path.abspath(__file__))
# Add project-specific directories to the Python path
project_path = current_directory
src_1_path = os.path.join(current_directory, 'src_1')
src_2_path = os.path.join(current_directory, 'src_2')
sys.path.insert(0, project_path)
sys.path.insert(0, src_1_path)
sys.path.insert(0, src_2_path)
另外 2 个 init.py 文件是空的。
first.py 包含:
import sys
def print_sys_path():
print(sys.path)
第二个.py 包含:
import first
if __name__ == "__main__":
# bar will be invoked if this module is being run directly, but not via import!
first.print_sys_path()
当我运行此程序时,出现以下错误:
D:\my_project>py src_2\second.py 回溯(最近一次调用最后一次): 文件“D:\my_project\src_2\second.py”,第 1 行,位于 先导入 ModuleNotFoundError:没有名为“first”的模块
我的最终项目将具有类似的结构,我只是想弄清楚它的路径独立打包。
我可能一开始就走错了方向。我计划在我交付的项目中采用以下结构:
my_project/
__init__.py
my_database/
__init__.py
database.py
my_gui/
__init__.py
gui.py
my_process/
__init__.py
process.py
..并希望最终使用 pyinstaller 将其打包为 2 个单独的可执行文件,gui.exe 和processor.exe。
是的,我是Python、包装等方面的新手,所以请保持温柔。我已阅读文档。我找不到任何与我的问题相关的内容来真正解决问题。
感谢您的时间和精力!
不幸的是,我们的 python 同伴使用了最烦人的打包系统之一, 太烦人了,我从来没有见过一个初学者刚刚开始了解包的概念 而不是陷入这个问题。
但是您可以使用以下命令导入
first
文件的内容:
first
在此相对导入中,
import ..src_1.first
语法是包目录中的GOING BACK
。概念
..
这是因为包的文件并不意味着可以直接运行,它们不能。 在这种情况下,您不应该运行其中一个文件,而应该运行整个文件夹。
__init__.py
打包中
python3 -m your_project
文件的概念说来话长,你可以在这里
了解更多。长话短说,当您运行整个项目文件夹时,python 将查找包以查找 main.py 文件。该文件必须位于文件夹层次结构的顶部:
__main__.py
your_project/
__init__.py
__main__.py
src_1/
first.py
__init__.py
src_2/
second.py
__init__.py
和 second.py
文件可以进行相对导入,但
first.py
文件不应该返回到目录中,如果您想导入任何其他文件夹,您应该使用它们的绝对路径。执行子包:
Python 之禅:
如果实现很难解释,那是个坏主意。 尝试使用默认打包系统并将主文件保留在顶层,并避免使用复杂的导入模式。