我正在使用PyInstaller来创建单文件可执行文件。我的脚本是否可以执行导入,以便i)导入的模块从与exe相同的目录导入(即它没有打包到exe中)和ii)导入的模块可以导入的其他模块打包到exe?
这里的背景是导入的模块包含用户应该能够修改的配置。这可能包括创建自定义派生类以及使用打包模块中的枚举。
我没有找到任何关于此的建议,虽然这是一个困难的搜索,因为有很多类似的主题使用基本相同的关键字。
答案 0 :(得分:5)
以下步骤允许导入PyInstaller创建的可执行文件之外的Python模块,并允许该模块导入捆绑到可执行文件中的模块。
excludes=['module_name']
添加到PyInstaller规范中使用的Analysis对象。这可以防止module_name.py
捆绑到可执行文件中。sys.path.append(os.path.dirname(sys.executable))
导入module_name
的位置。这允许从可执行文件所在的目录导入它。作为最后一点的一个例子,请考虑以下内容。
# 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那样用户友好。我还没有成功使用它。