从指定位置导入Python模块

8

假设我有三个脚本。Main.py(包含所有导入),1.py(随机脚本),2.py(随机脚本)。

pyinstaller -F --onedir Main.py (80mb)
pyinstaller -F --onedir 1.py (80mb)
pyinstaller -F --onedir 2.py (80mb)

这将创建3个文件夹,然后我将1.exe和2.exe与所有依赖项一起复制到主文件夹中,这样就可以成功运行。

image

存在两个问题:

第一个问题是大小。一个文件可以将其缩小到30mb,而一个文件夹保持在80mb。

更重要的是,exe文件无法离开该文件夹。我不得不在Python中使用快捷方式。

我正在遵循this,这据说是一种解决方法。

我的问题是,如何使用pyinstaller从选择的位置读取导入,以便我可以移动可执行文件?

逻辑: 使用pyinstaller -F –onefile Main.py (15mb)编译Main.py。

C:\13\创建文件夹,使exe看起来像C:\13\Main.exe

链接所有exe文件到C:\13,使用--runtime-tmpdir PATH

我很难找到有关从exe内部或“一个文件夹”中获取导入的文档。有很多关于一开始就获取导入的内容,但很少有关于从选择的位置获取导入,以便我可以在任何地方运行exe。此外,在pyinstaller中甚至很难找到模块,更增加了这种混乱。也许...
pyinstaller -F --runtime-tmpdir C:\13 --onefile 2.py

pyinstaller -F --runtime-tmpdir C:\13 --onedir 3.py

虽然对我来说没有创建目录,但我该如何从选择的位置获取导入?

另一个可能的解决方案

  if getattr(sys, 'frozen', False): 
      os.path.join(sys._MEIPASS, "C:\aa")

就像您可以在 image 中看到的那样,假设我们想要使用熊猫,有几个文件可供选择...


Pyinstaller的文档中有一个详细的章节,介绍如何打包多个exe共享相同的依赖项:https://pyinstaller.readthedocs.io/en/stable/spec-files.html#multipackage-bundles - Florent B.
@FlorentB. "这个功能在PyInstaller 3.0版本中出现了问题" - user8900239
2个回答

0

当PyInstaller切换到3.0版本时,我也遇到了同样的问题,但Nuitka为我解决了这个问题。

你可以将Main.py打包成一个.pyd库文件,然后为1.py2.py创建可执行文件,这些文件将从该“dll”中导入所有需要的软件包。因此,您可以将库文件放在特定位置,并在启动可执行文件之前相应地设置PYTHONPATH(例如,在批处理文件中或直接在shell配置中设置)。


我以前使用过Nuitka,但是设置起来非常混乱和有错误。我花了一整天去解决无尽的设置错误,这并不好玩,而且问题的文档很少。如果您能提供更详细的指南,我觉得其他人可能会受益。虽然“Nuitka”可能没有什么帮助,但我的心已经非常坚定地选择了Pyinstaller,因为它有很棒的文档和支持。 - user8900239

0

我进一步调查了此事,并认为这里提供的解决方案是我需要的答案。

由于现在这个功能已经损坏,因此无法使用onefile。

为了解决我的第一个问题,我使用了UPX和虚拟目录。最后,将所有文件放入一个目录中。最后,像我在图片中所做的那样将exe文件放入文件夹中,这意味着我有一个较小的文件。

如果这仍然是一个问题,我可以通过Python脚本创建快捷方式,但实际上没有必要,对我来说,在该文件夹中运行所有exe文件就足够了。他们可能会在未来修复onefile,但我对这个解决方案非常满意。

结果:更小的文件。

我可以在电脑上任何地方运行这些exe文件吗?很遗憾,没有多包捆绑的情况下是不行的。但是你可以创建快捷方式,这并不像我想象中的那么糟糕。虽然他们可能会在未来修复这个问题,但在此期间,这个解决方案已经足够好了。如果我说错了,请随时纠正我,但我对这个解决方案感到满意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接