简短问题
在构建pyinstaller可执行文件时,有没有办法控制/保证架构(32位对64位)?
背景
我从py2exe迁移到pyinstaller,因为缺乏64位支持以及一些我很难看过去的小东西.所以在那个说明中,我宁愿不回到它.我使用Python 2.7 64位开发了两个应用程序,并且在32位机器上运行时遇到了性能问题.
第一个是简单的wxPython GUI(版本2.9),并连接到USB驱动程序的Windows DLL文件.这个以32位运行似乎非常"安全",因为没有只有64位的模块.但是,在32位Windows XP上运行时,此应用程序在与USB设备通信时会出现严重的性能问题.
第二个应用程序要大得多,我还没有尝试构建和运行,因为担心架构问题.此应用程序中使用了多个64位模块(一个psycopg2).如果无法以32位可执行文件的形式运行,我想远离尝试构建它.
目前的想法
我觉得这可能是可能的(如果模块有32位支持),可以通过在32位模式下强制运行build.py来运行.这有意义吗?
更新
我在我正在建设的第一个项目上取得了一些突破.事实证明,性能问题完全取决于两台机器的速度.我的开发机器有足够的能力足够快地轮询USB设备,而速度慢得多的测试平台(Windows XP)没有.
我通过修改我轮询USB端口的方式修复了这个问题.既然已经修复了,我可以在两个系统上运行exe.尝试将可执行文件构建为单个文件时出现了一个新问题.当运行pyinstaller的Build.py时,它会提取应用程序运行所需的所有DLL.这看起来效果很好,但是当我尝试运行我在Windows 7 64bit上构建的单个exe时,它不能在Windows XP上运行,因为USB加密狗的DLL未被识别为有效的DLL.
为了让单个exe在两个系统上运行,我首先尝试从.spec文件中删除DLL(它似乎是一个python脚本).这很方便,因为我能够使用普通的python列表修饰符修改构建命令之前的包含列表.我希望如果在exe的临时目录中找不到DLL,它会在系统路径上找到它.虽然这种方法可能有效,但我无法在不丢失大量错误的情况下运行它.
我的第二次尝试是在Windows XP机器上构建应用程序(保留嵌入的DLL),希望Win XP DLL可以在Windows 7中运行.成功!这种配置效果很好; 但我坚信这不是最好的解决方案,因为它完全取决于在较新的操作系统上运行的旧DLL.
我正在开始一个小型/中型python项目,可能是在测试驱动开发中.我的背景更多是C和java而不是python(我使用了ant和makefile)
我知道在python中你可能不需要构建工具,但我会,因为我会使用cython和PyInstaller(这个东西应该在几个不同的UNIX上运行,而不是直接依赖于python)而且我想要方便从CLI中选择测试,构建文档,可能检查依赖关系等.
有人抱怨python缺乏类似make的工具.我知道很少有工具,比如scon和摊铺机,但我想听听真实用户而不仅仅是他们的网站.有人使用摊铺机吗?
什么是许多软件包附带的常见setup.py?我查看了一些,看看是否有一个常见的用法,但我没有发现任何有趣的东西(也许我使用了错误的例子)
你是否建议至少坚持使用我已经知道的东西(ant和Makefile)?如果是这样,你有没有为python推荐的ant扩展(+ cython + pyinstaller + pyUnit)?
编辑:为了避免像jwp那样的进一步答案,请注意,对于这个项目,我绝对需要我的程序是一个独立的可执行文件,因为绝对不可能在目标平台上运行可执行文件的python VM.我有完全相同的hw可用于编译,所以幸运的是我不需要交叉编译(但我会在更友好的Linux上进行开发).
我还想测试我的代码是否从一开始就在Cython中编译,而不是过早优化,但只是为了确保我不会使用不兼容的功能太过分,如果Cython需要进行痛苦的重构将是非常需要的.
所以请关注我的实际问题
我一直在谷歌上搜索这段时间而没有结果.该PyInstaller手册说:
--version-file=FILE
add a version resource from FILE to the exe
听起来很棒.我想将版本信息放在我的可执行文件中.问题是我不知道"版本文件"是什么样的,我找不到一个我可以使用的例子.我会考虑一个版本文件的例子作为这个问题的可接受的答案.
手册还说:
版本
仅适用于Windows NT系列.版本= 'myversion.txt'.使用GrabVersion.py从可执行文件中窃取版本资源,然后编辑输出以创建自己的版本.(版本资源的语法是如此神秘,我不会尝试从头开始编写.)
我现在尝试使用来自我系统的无数可执行文件.我只是不断收到这些错误:
Traceback (most recent call last):
File "C:\pyinstaller-2.0\utils\GrabVersion.py", line 42, in
vs = versioninfo.decode(sys.argv[1])
File "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", line 33, in decode
nm = win32api.EnumResourceNames(h, RT_VERSION)[0]
IndexError: list index out of range
在没有版本信息的可执行文件上,以及:
Traceback (most recent call last):
File "C:\pyinstaller-2.0\utils\GrabVersion.py", line 43, in
print vs
File "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", line 147, in __repr__
% (indent, self.ffi.__repr__(indent), indent,
File "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", line 251, in __repr__
"filevers=%s," … 我使用命令:
pyinstaller.exe --icon=test.ico -F --noconsole test.py
Run Code Online (Sandbox Code Playgroud)
所有图标都不会更改为test.ico
一些图标保持默认(pyinstaller)图标...
为什么?
所有图标更改操作系统 - > Windows 7 32位,Windows 7 64位(制作exe文件操作系统)
保持默认图标OS - > windows 7 64bit(其他PC)
我有一个简单的pandas pyinstaller exe,超过40MB.
我的exe示例:
import collections
import csv
import selenium
import pandas
print('hi')
Run Code Online (Sandbox Code Playgroud)
40MB +这似乎有点矫枉过正.
我怎样才能尽可能减少这个?
一种方法:
pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py
Run Code Online (Sandbox Code Playgroud)
然而,考虑到排除列表的大小,这是不切实际的.
如何为pyinstaller选择一个文件夹来获取模块并排除其他所有文件,这样我可能会有一个小应用程序?
规格文件:
a = Analysis(['123.py'],
pathex=['C:\\Users\\AA\\ZZ'],
binaries=[],
datas=[],
hiddenimports=[],
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='123',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
Run Code Online (Sandbox Code Playgroud)
这也值得一提.默认情况下,Pyinstaller不会检测到pandas.
加:
hiddenimports = ['pandas._libs.tslibs.timedeltas']
To: C:\Users\<NAME>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks
Run Code Online (Sandbox Code Playgroud)
使用多个可执行文件时可能的解决方案是将每个可执行文件链接到单独的文件夹或可执行文件以及所有导入.
为什么多处理模块需要在"冻结"以生成Windows可执行文件时调用特定函数才能工作?
我尝试使用PyInstaller在Windows 7下编译Python项目.该项目工作正常,没有问题,但是当我尝试编译它时,结果不起作用.虽然在编译期间我没有收到任何警告warnmain.txt,但build目录中的文件中有许多警告:warnmain.txt
我真的不明白那些警告,例如"没有名为numpy.pi的模块",因为numpy.pi它不是模块而是数字.我从未尝试过导入numpy.pi.我做进口numpy和matplotlib明确.另外我正在使用PyQt4.我认为错误可能与这些库有关.
但是我能够编译一个成功使用numpy的简单脚本:
import sys
from PyQt4 import QtGui, QtCore
import numpy as np
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.pb = QtGui.QPushButton(str(np.pi), self)
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
这里成功意味着创建的可执行文件实际上显示了所需的输出.但是,还会warnmain.txt创建一个文件,其中包含与之前完全相同的"警告".因此,我认为编译我的实际项目没有取得任何成功的事实不是(或至少不仅仅)与这些警告相关.但那么还有什么可能是错误呢?编译期间唯一的输出是'INFO',并且没有一个是否定的声明.
我没有指定一个额外的钩子目录,但钩子使用默认目录向下,只要我可以从编译输出读取,例如hook-matplotlib执行.我看不到任何钩子,numpy因为我的小例子脚本也没有,但这个有用.我在我的文件中使用了以下导入(不是全部在同一个但在不同的文件中):
import numpy as np
import matplotlib.pyplot as ppl
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from PyQt4 import QtGui, QtCore
import json …Run Code Online (Sandbox Code Playgroud) 这很容易重新创建.如果我的脚本foo.py是:
import scipy
Run Code Online (Sandbox Code Playgroud)
然后运行:
python pyinstaller.py --onefile foo.py
Run Code Online (Sandbox Code Playgroud)
当我启动foo.exe时,我得到:
WARNING: file already exists but should not: C:\Users\username\AppData\Local\Temp\_MEI86402\Include\pyconfig.h
Run Code Online (Sandbox Code Playgroud)
我已经测试了几个版本,但最新的我已经确认是在Win7上运行的2.1dev-e958e02,Python 2.7.5(32位),Scipy版本0.12.0
我已经向Pyinstaller人员提交了一张票,但还没有听到任何消息.任何线索如何进一步调试?
我正在克服这个错误的困难时期,我已经到处搜索该错误消息,似乎与我的情况无关:
"failed to execute script new-app"
Run Code Online (Sandbox Code Playgroud)
new-app是我的python GUI程序.当我使用此命令运行pyinstaller时:
pyinstaller.exe --onedir --hidden-import FileDialog --windowed --noupx new-app.py
Run Code Online (Sandbox Code Playgroud)
它运作顺利.另外,当我执行命令行来运行gui程序时,它运行正常,并使用以下命令生成GUI:
.\dist\new-app\new-app.exe
Run Code Online (Sandbox Code Playgroud)
但是当我去那个文件希望能够点击应用程序来获取GUI时,它会给我上面说的错误.这是为什么?
我使用的是python2.7,操作系统是Windows 7企业版.
任何输入将受到赞赏,并提前感谢.
我正在尝试使用PyInstaller(开发版)为Windows将Python脚本包装到exe中.
该脚本使用Pandas,我在运行exe时遇到了错误.
Traceback (most recent call last): File "site-packages\pandas\__init__.py", line 26, in <module> File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
exec(bytecode, module.__dict__) File "site-packages\pandas\_libs\__init__.py", line 4, in <module> File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 714, in load_module
module = loader.load_module(fullname) File "pandas/_libs/tslib.pyx", line 1, in init pandas._libs.tslib ModuleNotFoundError: No module named 'pandas._libs.tslibs.timedeltas'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "G5k Version file Extract (with tkinter).py", line 15, in <module> File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
exec(bytecode, …Run Code Online (Sandbox Code Playgroud) pyinstaller ×10
python ×9
windows ×4
pandas ×2
32bit-64bit ×1
cx-freeze ×1
executable ×1
explorer ×1
icons ×1
matplotlib ×1
numpy ×1
py2exe ×1
pyqt4 ×1
python-3.x ×1
scipy ×1
selenium ×1
tdd ×1
tkinter ×1
unit-testing ×1
usb ×1