我在Windows中,使用pyInstaller打包python文件。但是发生了一些错误:
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in i
mportHook
mod = _self_doimport(nm, ctx, fqname)
File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in d
oimport
exec co in mod.__dict__
File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.p
yz\SocketServer", line 132, in <module>
File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in i
mportHook
mod = _self_doimport(nm, ctx, fqname)
File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in d
oimport
exec co in mod.__dict__
File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.p
yz\socket", line 47, in <module>
File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in i
mportHook
raise ImportError("No module named %s" % fqname)
ImportError: No module named _socket
我知道_socket
位于路径C:\Python27\libs\_socket.lib
中,但如何让EXE
找到该文件?
答案 0 :(得分:2)
您可以添加应用程序规范文件的路径。
在Analysis对象中,您可以指定pathex=['C:\Python27\libs\', 'C:\Python27\Lib\site-packages']
以及任何其他路径......
请注意,如果找不到路径,则没有问题......我也有来自linux的路径。
答案 1 :(得分:2)
这听起来像是hidden imports的工作(仅在最新版本中可用)。
来自文档
a = Analysis(['myscript.py'],
hiddenimports = ['_socket'],
<and everything else>)
答案 2 :(得分:2)
如果您使用的是virtualenv,则应使用“-p”或“--path ='D:...'”选项。像这样:
pyinstaller.exe --onefile --paths=D:\env\Lib\site-packages .\foo.py
这样做是使用此pathex路径生成foo.spec文件
答案 3 :(得分:1)
就我而言,我必须删除目录中与pyinstaller
相关的所有文件夹和文件,即__pycache__
,build
,dist
和{{1} }。我重新运行该版本,该exe正常工作。
答案 4 :(得分:1)
只需删除 '__pycache__'
目录,然后再次运行您的 exe 文件。对我有用
答案 5 :(得分:0)
上述答案都不适合我,但我确实让它发挥作用。我使用的是openpyxl,它在datetime.py模块中需要jdcal。没有任何隐藏的导入或任何这些方法有帮助,运行exe仍然会说jdcal没有找到。我使用的解决方法是将jdcal中的少数函数直接复制到openpyxl代码中的datetime.py中。然后跑了
pyinstaller -F program.py
它有效!
答案 6 :(得分:0)
有类似的问题。这是我对PyQt5,cffi,python 3.4.3的修复:
这会修复'sip'未找到错误,如果出现'_cffi_backend'错误:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['LightShowApp.py'],
pathex=['c:\\MyProjects\\light-show-editor-36',
'c:\\Python34\\libs\\', 'c:\\Python34\\Lib\\site-packages'],
binaries=None,
datas=None,
hiddenimports=['sip', 'cffi'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='LightShowApp',
debug=False,
strip=False,
upx=True,
console=True )
看看上面的'pathex'和'hiddenimports'。这些是默认生成的唯一更改。用以下代码构建exe:
pyinstaller LightShowApp.spec -F
我在venv之外跑或者赢得了胜利 - 无论那个垃圾是为了什么!
答案 7 :(得分:0)
执行程序不知道库的位置,“ C:\ Python27 \ Lib \ site-packages”等。因此,pyinstaller在创建可执行文件时绑定模块位置。因此,您需要将已使用的所有模块导入程序中。
在主文件中导入“ _socket”模块,然后使用pyinstaller重新编译。
我可能会工作。
注意:,但是系统中安装的模块和程序中使用的模块的版本必须兼容。
答案 8 :(得分:0)
如果您使用的是虚拟环境,则问题出在环境上。
解决方案 只需激活环境并运行 pyinstaller 命令。例如,如果您使用的是 pipenv 环境,则按以下顺序运行命令。
pipenv shell # To activate environment
pyintaller --onefile youscript.py # Command to generate executable