python 打包未运行,被视为模块

问题描述 投票:0回答:1

我正在尝试在 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 package relative-path
1个回答
0
投票

您好先生/女士。


不幸的是,我们的 python 同伴使用了最烦人的打包系统之一, 太烦人了,我从来没有见过一个初学者刚刚开始了解包的概念 而不是陷入这个问题。


导入:


不幸的是,Python 导入系统无法以这种特定方式找到文件,这意味着当您尝试导入时,Python 将在其主包文件夹中搜索该特定文件(就像导入任何类型的库,例如 .env、pathlib、 sys、ETC ),即使您将其添加到 python 路径中。 (这称为绝对导入。了解相对导入和绝对导入之间的差异将很有帮助)。

但是您可以使用以下命令导入 
first

文件的内容:

first

在此相对导入中,

import ..src_1.first

语法是包目录中的

GOING BACK

概念


即使您将这种类型的导入与

..
文件一起使用,Python 仍然会引发相同的错误。

这是因为包的文件并不意味着可以直接运行,它们不能。
在这种情况下,您不应该运行其中一个文件,而应该运行整个文件夹。

__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 之禅:

如果实现很难解释,那是个坏主意。 尝试使用默认打包系统并将主文件保留在顶层,并避免使用复杂的导入模式。

© www.soinside.com 2019 - 2024. All rights reserved.