在项目中创建带有包的可执行Zip存档

时间:2019-05-18 22:04:55

标签: python python-3.x python-import python-3.7 python-module

我觉得这个问题需要一个更好的标题,如果有人提出更好的建议,我将对其进行修改。问题是我不确定我在这里使用的功能的术语。

描述我的问题的最好方法是展示我的所作所为。该项目在这里:https://github.com/jeffnyman/quendor

已设置此项目,因此可以将其作为模块执行。例如,可以从项目根目录执行此操作:

python3 -m quendor

我也有一个生成脚本来生成内存中的zip(如果我正确使用了该术语):

https://github.com/jeffnyman/quendor/blob/master/build.py

工作原理是,如果您运行build.py,它将生成一个执行整个项目的quendor.py文件。 在我包括其他目录(例如我的utilitieszinterface)之前一直很好。

如果您运行构建(.\build.py),然后运行生成的文件,则现在将项目保留在仓库中,

./quendor.py

您收到以下错误:

File "./quendor.py/quendor/__main__.py", line 6, in <module>
ModuleNotFoundError: No module named 'quendor.zinterface'

因此,要点:如果我的所有文件都在同一目录(即quendor中),则此生成脚本在生成可执行脚本文件方面效果很好。 < / p>

但是一旦我在这些目录中包含了子目录和文件,上面的错误就会使我无所适从。

我确定所有文件都已收集。我从第18行(https://github.com/jeffnyman/quendor/blob/master/build.py#L18)开始处理。如果要在第24行添加以下语句:

print(f"* {file_path}")

您会看到它输出以下内容:

* quendor/__init__.py
* quendor/__version__.py
* quendor/zinterface/fileio.py
* quendor/utilities/messages.py
* quendor/__main__.py

因此,我怀疑这可能与我在第28行(https://github.com/jeffnyman/quendor/blob/master/build.py#L28)处写入字符串的代码有关。我觉得我需要做更多的工作,以使可执行的压缩脚本文件了解有关模块的信息。

但是我不确定(1)我是否准确,(2)我是否准确,如果可能的话。我发现我在这里有点头疼。

任何想法都将不胜感激,我很乐意对任何必要的说明或术语进行更新。

3 个答案:

答案 0 :(得分:1)

因此,除非我有更高的声誉,否则它不会让我发表评论,但我可以发布答案。即使我没有答案,但也有评论。我认为上面的注释并不是要用于您实际的__main__.py文件,而是要在您的quendor.py文件中生成的注释。您可能想尝试将import语句添加到您编写的打包字符串中。

例如,看看在第32行上添加以下内容会发生什么:import quendor.zinterface.fileio as zio。 (不要替换那里的行。只放我的行,然后保留其他行。)我不确定zip进程如何工作,但是不确定是否尝试镜像应该起作用的模块进程。但是,如果没有,那将行不通。您可能还只想尝试做import quendor.zinterface。就其本身而言,这是行不通的,但是看看它是否给您带来了另一个错误将很有趣。

答案 1 :(得分:0)

在我的回购中可以想到的几乎所有导入和文件收集的变化,都有好消息/坏消息。

  • 坏消息是答案是这样:不可能。

  • 好消息是:如果仅将所有文件都保留在quendor目录中,而不是拥有子目录,那么您的实现确实可行。

另一个好消息是您偶然发现了一些东西,并提出了一个问题,即Python专家无法回答。在其中可以找到一定的乐趣!我保证您将无法获得有效的答案(“一个目录中的所有文件”解决方案除外)。

对答案的一种改进是,如果您要将程序设置为仍然作为模块运行,则只需使用pip配置。基本上,您可以执行所需的操作,而不必经历扭曲。 (除非出于某种原因而不是使用pip来进行构建,否则都是这样。)

答案 2 :(得分:0)

实际上,事实证明我找到了一种方法!它需要使用os.walk而不是os.listdir。这需要采取一些人们在这里讨论的想法。这是完成技巧的脚本:

https://github.com/jeffnyman/quendor/blob/master/build.py

您可以将其与尝试以不同方式处理此问题的previous commit进行比较。

Eldritch是对的,我不能只展平目录,也不能将导入内容添加到要写入最终zip文件的字符串中。让·弗朗索瓦(Jean-François)正确的是,我必须专注于正在生成的__main__.py。我的贡献是找出os.walk(),然后找出parameterizing the written string处理不同的目录。

最后,按照HTF的建议,此解决方案确实需要在每个程序包中放入一个空的__init__.py文件。

使用我的解决方案后,您可以运行build.py,然后生成quendor.py脚本。然后,该脚本就可以正确识别各种程序包的导入,从而正确执行。