我创建了两个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
模块。
答案 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 相同的问题(由于这在谷歌搜索中经常出现,我想我会添加我的经验)。
类似的文件夹布局,保存在同一位置包含 common
的 mycommon.py
文件夹。作为 CI 构建步骤的一部分,我正在从 myMainDir
运行 PyInstaller。
我已经尝试了建议的解决方案:设置 --paths
,在 spec
文件中声明隐藏的导入等等。我仍然无法让它工作。
在运行 PyInstaller 之前,我通过在构建脚本中添加一个步骤将 common
文件夹复制到 myMainDir
中,最终“解决”了这个问题。