由pyinstaller创建的exe文件,在运行时找不到自定义模块

时间:2015-08-19 10:57:05

标签: python python-2.7 python-3.x python-2.6 pyinstaller

我创建了两个python文件,目录/文件关系如下:

mytest---
     |---mycommon.py
     |---myMainDir---
                     |----myMain.py

在mycommon.py中:

def myFunc(a):
    ...

在myMain.py中:

import sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath('__file__')), '..'))
import mycommon.py
mycommon.myFunc("abc")

然后我使用pyinstaller创建了exe:

pyinstall.py -F mytest\myMainDir\myMain.py

创建了MyMain.exe,但在运行时,告知无法找到mycommon模块。

3 个答案:

答案 0 :(得分:14)

PyInstaller 的官方手册describes此问题:

  

某些 Python 脚本以 PyInstaller 无法检测到的方式导入模块:例如,通过将__import__()函数与变量数据一起使用,或者操纵{{ 1}}运行时的值。如果您的脚本需要 PyInstaller 不知道的文件,您必须提供帮助。

这也是suggests在这种情况下应该做些什么:

  

如果Analysis认识到需要一个模块,但找不到该模块,那通常是因为脚本正在操作sys.path。在这种情况下最简单的方法是使用sys.path选项列出脚本可能搜索导入的所有其他位置:

     
    

--paths=

  
     

这些路径将在分析过程中添加到当前pyi-makespec --paths=/path/to/thisdir --paths=/path/to/otherdir myscript.py

因此,请在构建应用程序时指定sys.path参数。指定--paths参数的手册states是等效的:

  

-p-p dir_list

     
    

设置导入模块的搜索路径(例如使用--paths=dir_list)。当代码修改PYTHONPATH进行导入时,使用此选项可帮助 PyInstaller 在正确的位置进行搜索。将一个或多个路径分隔为sys.path(在 Windows 下)或;(所有其他平台),或者多次提供该选项以提供多个搜索路径。< / p>   

答案 1 :(得分:0)

此外,我还需要努力使pyinstaller正确地将python脚本导入子文件夹,该子文件夹的路径是通过sys.path.insert相对设置的。

Yoel的回答对我来说是正确的,但是我需要在Windows中仔细设置路径。这是我所做的:

我的主要py是:

D:\_Development\pCompareDBSync\pCompareDBSync\pCompareDBSync.py

我导入的py是:

D:\_Development\pCompareDBSync\pCompareDBSync\py\pCompareNVR.py

(我在文件夹。\ py \中有很多这样的导入py,但是在这里我仅使用一个作为示例)

所以我的主要PY包括:

sys.path.insert(0, 'py')

try:
    from pCompareNVR import fgetNV_sN_dict
    from pCompareNVR import findNVRJobInDBSync
    from pCompareNVR import getNVRRecords
    from pCompareNVR import saveNVRRecords
    from pCompareNVR import compareNVRs
except Exception as e:
    print('Can not import files:' + str(e))
    input("Press Enter to exit!")
    sys.exit(0)

pyinstaller --onefile pCompareDBSync.py 

->不包含py / pCompareNVR.py的pCompareDBSync.exe

我必须在主PY和导入的PY中包括绝对填充:

pyinstaller --onefile --paths=D:\_Development\pCompareDBSync\pCompareDBSync\ --paths=D:\_Development\pCompareDBSync\pCompareDBSync\py pCompareDBSync.py

-> pCompareDBSync.exe现在包含py / pCompareNVR.py->确定

那为我解决了这个问题!

答案 2 :(得分:0)

我遇到了与 OP 相同的问题(由于这在谷歌搜索中经常出现,我想我会添加我的经验)。

类似的文件夹布局,保存在同一位置包含 commonmycommon.py 文件夹。作为 CI 构建步骤的一部分,我正在从 myMainDir 运行 PyInstaller。

我已经尝试了建议的解决方案:设置 --paths,在 spec 文件中声明隐藏的导入等等。我仍然无法让它工作。

在运行 PyInstaller 之前,我通过在构建脚本中添加一个步骤将 common 文件夹复制到 myMainDir 中,最终“解决”了这个问题。