我觉得这个问题需要一个更好的标题,如果有人提出更好的建议,我将对其进行修改。问题是我不确定我在这里使用的功能的术语。
描述我的问题的最好方法是展示我的所作所为。该项目在这里:https://github.com/jeffnyman/quendor
已设置此项目,因此可以将其作为模块执行。例如,可以从项目根目录执行此操作:
python3 -m quendor
我也有一个生成脚本来生成内存中的zip(如果我正确使用了该术语):
https://github.com/jeffnyman/quendor/blob/master/build.py
工作原理是,如果您运行build.py
,它将生成一个执行整个项目的quendor.py
文件。 在我包括其他目录(例如我的utilities
和zinterface
)之前一直很好。
如果您运行构建(.\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)我是否准确,如果可能的话。我发现我在这里有点头疼。
任何想法都将不胜感激,我很乐意对任何必要的说明或术语进行更新。
答案 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
脚本。然后,该脚本就可以正确识别各种程序包的导入,从而正确执行。