pyinstaller:添加动态加载的模块

时间:2017-09-25 07:00:34

标签: python pyinstaller

我试图使用Pyinstaller捆绑用Python3编写的服务器。部分服务器代码是以某种模式动态加载的方式编写的:

mod_files = [f for f in os.listdir(path)]:
for f in mod_files:
   mod = importlib.import_module(mod_name)

如何使用Pyinstaller处理这些文件?

2 个答案:

答案 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