我使用PyQt4在Python 3.1中构建了一个相当简单的应用程序。完成后,我希望将应用程序分发到计算机而不安装任何一个。
我几乎完全关心Windows平台,所以我的目标是拥有一个可执行文件,最后可能还有一些资源文件和.dll。
四处搜寻后,我得出结论
Y:\Users\lulz\build\exe.win32-3.1>system_shutdown.exe
Traceback (most recent call last):
File "Y:\Program Files (x86)\Python\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 27, in exec(code, m.__dict__)
File "Y:/Users/lulz/Documents/Coding/Python3/projects/System Shutdown/system_shutdown.pyw", line 5, in from PyQt4 import QtCore
File "ExtensionLoader_PyQt4_QtCore.py", line 16, in AttributeError: 'NoneType' object has no attribute 'modules'
所以我的问题基本上是两个问题:
如有必要,我可以提供有关第二个问题的更多信息,例如我调用cx_Freeze,我的distutils安装脚本等。
感谢您的帮助和评论。
答案 0 :(得分:13)
您可以通过在cx_Freeze包中将一行代码附加到freeze.py来解决此问题。
这里描述: http://www.mail-archive.com/cx-freeze-users@lists.sourceforge.net/msg00212.html
至少对我有用:)
干杯, 的Almar
答案 1 :(得分:1)
对于Python 3.3及更高版本,这里有一个很好的解决方案: py2exe - generate single executable file
安装py2exe:
pip install py2exe
然后添加' your_script.py'文件,以下' Make_exe.py'文件:
from distutils.core import setup
import py2exe, sys
class Make_exe():
def __init__(self, python_script):
sys.argv.append('py2exe')
setup(
console=[{'script': python_script}],
zipfile = None,
options={
'py2exe':
{
'bundle_files': 1,
'compressed': True,
# Add includes if necessary, e.g.
'includes': ['lxml.etree', 'lxml._elementpath', 'gzip'],
}
}
)
if __name__ == '__main__':
Make_exe('your_script.py')
如果你想制作你的__script.py' 重建自己为' your_script.exe' 每次在python中运行时,都可以添加到其主屏幕:
import subprocess
import sys
if __name__ == '__main__':
currentFile = sys.argv[0]
if currentFile.lower().endswith(".py"):
exitCode = subprocess.call("python Make_exe.py")
if exitCode==0 :
dirName = os.path.dirname(currentFile)
exeName = os.path.splitext(os.path.basename(currentFile))[0] + '.exe'
exePath = dirName + "/dist/" + exeName
cmd = [exePath] + sys.argv[1:]
print ("Executing command:\n %s" % cmd)
exitCode = subprocess.call(cmd)
sys.exit(exitCode)
else:
print ("This will be executed only within the new generated EXE File...")