我试图使用Pyinstaller捆绑用Python3编写的服务器。部分服务器代码是以某种模式动态加载的方式编写的:
mod_files = [f for f in os.listdir(path)]:
for f in mod_files:
mod = importlib.import_module(mod_name)
如何使用Pyinstaller处理这些文件?
答案 0 :(得分:2)
Pyinstaller(当前为v 3.4)无法检测到诸如create or replace function "email"
( name_in IN varchar2 )
RETURN number
IS
supervisoremail varchar2(30);
CURSOR c1
IS
select
supervisoremail
from
EMPLOYEE,supervisors
where TO_DATE(contract_start_period,'DD-MM-YYYY') < TO_DATE (SYSDATE,'DD-MM-YYYY') - 275
and (supervisors.supervisorname = employee.supervisorname1
or supervisors.supervisorname = employee.supervisorname2)
and employee_name ='test'
;
BEGIN
OPEN c1;
FETCH c1 INTO supervisoremail;
CLOSE c1;
RETURN supervisoremail;
END;
之类的导入。 Pyinstaller的documentation中详细介绍了该问题和解决方案,我将其粘贴在下面作为入口点。
某些Python脚本以PyInstaller无法检测到的方式导入模块:例如,通过对变量数据使用
importlib.import_module()
函数,使用__import__()
或在运行时操作imp.find_module()
值。如果您的脚本需要PyInstaller不知道的文件,则必须提供帮助:
- 您可以在
sys.path
命令行上提供其他文件。- 您可以在命令行上提供其他导入路径。
- 您可以编辑首次为脚本运行PyInstaller编写的
pyinstaller
文件。在规范文件中,您可以告诉PyInstaller有关脚本唯一的代码模块。 您可以编写“挂钩”文件,将隐藏的导入通知PyInstaller。如果为其他用户也可能使用的软件包创建“挂钩”,则可以将挂钩文件贡献给PyInstaller。如果您的程序依赖于对某些数据文件的访问,则可以告诉PyInstaller也将它们包括在捆绑软件中。为此,您可以修改规范文件,该文件是Using Spec Files涵盖的高级主题。
为了在运行时查找包含的文件,您的程序需要能够以一种有效的方式在运行时学习其路径,而不管它是否从捆绑软件中运行。 Run-time Information对此进行了介绍。
答案 1 :(得分:1)
我不确定mod_name
的值,但是事实证明,在PyInstaller冻结之后,私有模块不能不能导入。即
mod = importlib.import_module("module.__somename__")
将在打包后导致ModuleNotFoundError
,尽管它可能与带有打包脚本一起工作。
非私有包应使用import_module很好地导入,例如
mod = importlib.import_module("module.somename")
当然,前提条件是确保根据文档Listing Hidden Imports为所有动态导入模块正确设置--hidden-import
。