所以现在,我有一个python程序,我想将其转换为可执行文件(最好是单个文件)。目前,目标系统只有RedHat(和CentOS)和Debian(和Ubuntu)。
首先,我尝试过PyInstaller,但在运行之后,它会创建一个 .spec 文件和2个名为build和dist的文件夹。我不知道如何从那里开始。
其次,我尝试了随python一起提供的freeze.py。我理解其用法如下:
python /path/to/freeze.py /path/to/myfile.py
这会引发错误***Test Failed*** 2 failures
和NameError: name 'testdata' is not defined
完整错误如下:
**********************************************************************
File "/usr/lib/python2.6/site-packages/freeze.py", line 117, in __main__.freeze
Failed example:
testdata = json.loads(
gzip.open("testdata.json.gz", "r").read().decode()
)
Exception raised:
Traceback (most recent call last):
File "/usr/lib64/python2.6/doctest.py", line 1253, in __run
compileflags, 1) in test.globs
File "<doctest __main__.freeze[3]>", line 2, in <module>
gzip.open("testdata.json.gz", "r").read().decode()
File "/usr/lib64/python2.6/gzip.py", line 33, in open
return GzipFile(filename, mode, compresslevel)
File "/usr/lib64/python2.6/gzip.py", line 79, in __init__
fileobj = self.myfileobj = __builtin__.open(filename, mode or 'rb')
IOError: [Errno 2] No such file or directory: 'testdata.json.gz'
**********************************************************************
File "/usr/lib/python2.6/site-packages/freeze.py", line 121, in __main__.freeze
Failed example:
freeze(testdata) == freeze_fast(testdata)
Exception raised:
Traceback (most recent call last):
File "/usr/lib64/python2.6/doctest.py", line 1253, in __run
compileflags, 1) in test.globs
File "<doctest __main__.freeze[4]>", line 1, in <module>
freeze(testdata) == freeze_fast(testdata)
NameError: name 'testdata' is not defined
**********************************************************************
1 items had failures:
2 of 8 in __main__.freeze
***Test Failed*** 2 failures.
我想帮助使用2中的任何一个(或任何其他可以帮助我获得相同结果的工具)。
感谢。
答案 0 :(得分:2)
如果要使其可执行,则必须chmod +x /path/to/script.py
。这使任何人都可以运行该文件。然后你可以python /path/to/script.py
。
你仍然需要用python启动命令,这很难看。如果将此行#!/usr/bin/env python
添加到脚本的第一行。这被称为shebang或hashbang。然后(仍然记得chmod它)你可以/path/to/script.py
它将执行。
如果您已经在脚本目录中,则可以./script.py
。 (还记得要把它和一个shebang chmod)
如果您仍然不满意,并且想要输入只是脚本的名称,则将脚本移动到路径中的一个文件夹中(可以通过键入找到) shell中的echo $PATH
,通常是/ usr /,/ bin /,/ usr / local / bin,或类似的东西)。如果您将脚本移动到其中一个文件夹中,那么您可以script.py
。如果您这样做,我建议您删除.py扩展名,这样您就可以输入script
。至少在它的调用中,这会使其看起来像其他unix shell命令(ls,grep,cat)。
答案 1 :(得分:2)
您可能希望调查Nuitka。它需要python源代码并将其转换为C ++ API调用。然后它编译成可执行的二进制文件(Linux上的ELF)。它已经存在了几年,并支持各种Python版本。
如果您使用它,您可能也会获得性能提升。推荐使用。
答案 2 :(得分:2)
使用-F
标记pyinstaller.py
将创建一个可执行文件,并将其放入dist/
目录。
pyinstaller.py --help
显示了一长串选项。
pyinstaller-X.X/doc
目录包含HTML和PDF格式的完整手册。
答案 3 :(得分:-1)
您可以尝试使用cython将其转换为c可执行文件