在使用PyInstaller创建的单文件exe中导入外部模块

时间:2017-11-17 11:53:44

标签: python pyinstaller

我正在使用PyInstaller来创建单文件可执行文件。我的脚本是否可以执行导入,以便i)导入的模块从与exe相同的目录导入(即它没有打包到exe中)和ii)导入的模块可以导入的其他模块打包到exe?

这里的背景是导入的模块包含用户应该能够修改的配置。这可能包括创建自定义派生类以及使用打包模块中的枚举。

我没有找到任何关于此的建议,虽然这是一个困难的搜索,因为有很多类似的主题使用基本相同的关键字。

2 个答案:

答案 0 :(得分:5)

以下步骤允许导入PyInstaller创建的可执行文件之外的Python模块,并允许该模块导入捆绑到可执行文件中的模块。

  • excludes=['module_name']添加到PyInstaller规范中使用的Analysis对象。这可以防止module_name.py捆绑到可执行文件中。
  • 添加sys.path.append(os.path.dirname(sys.executable))导入module_name的位置。这允许从可执行文件所在的目录导入它。
  • 确保在导入外部模块之前,外部模块执行的任何导入也由其中一个捆绑模块执行。解释器不会解析外部模块对捆绑模块的导入,但使用sys.modules中已存在的模块。

作为最后一点的一个例子,请考虑以下内容。

# bundled_module1.py
import external_module
# bundled_module2.py
# module content
# external_module.py
import bundled_module2

这将在external_module.py中失败,因为找不到导入的模块。但是,以下内容可行:

# bundled_module1.py
import bundled_module2
import external_module
# bundled_module2.py
# module content
# external_module.py
import bundled_module2

如果外部应该能够导入一组有限的捆绑模块,这将没有问题。对于较大的套装,它可能会变得笨重。

鉴于文档声明解释器解析对可执行文件中捆绑的模块的导入,这感觉就像一个可能的错误。但是,没有明确地调用与可执行文件之外的模块的互操作。

答案 1 :(得分:0)

输入Pyinstaller -h。它将为您提供有关pyinstaller的信息,并告诉您有关--runtime-hook的信息。我认为将此添加到可执行文件应该工作。实际上有一整页documentation。很惊讶你找不到。

反正

文件说放入: pyinstaller --additional-hooks-dir=. myscript.py

我认为像pyinstaller --additional-hooks-dir=C:\pathtofolder myscript.py这样的东西应该在理论上起作用。然而要测试它。告诉我们它是如何发生的以及使扭结使它适合你的原因。

最后,如果你想成为时髦,请尝试将cython用于速度和混淆。公平的警告,cython并不像pyinstaller那样用户友好。我还没有成功使用它。