2

所以现在,我有一个 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 中的任何一个(或任何其他可以帮助我获得相同结果的工具)。

谢谢。

4

4 回答 4

2

您可能希望调查Nuitka。它采用 python 源代码并将其转换为 C++ API 调用。然后它编译成可执行二进制文件(Linux 上的 ELF)。它已经存在了几年,并且支持广泛的 Python 版本。

如果您使用它,您可能还会获得性能改进。推荐的。

于 2013-08-09T09:14:38.833 回答
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。(仍然记得 chmod 它并在 shebang 中)

如果您仍然不满意,并且只想输入脚本的名称,请将脚本移动到路径上的文件夹之一(您可以通过输入echo $PATHshell 来找到该文件夹​​,通常是 /usr/, /bin/、/usr/local/bin 或类似的东西)。如果您将脚本移动到其中一个文件夹中,那么您只需script.py. 如果你这样做,我建议你删除 .py 扩展名,这样你就可以输入script. 至少在其调用中,这将有点像其他 unix shell 命令(ls、grep、cat)。

于 2013-08-09T08:29:24.477 回答
2

使用该-F标志pyinstaller.py将创建一个单独的可执行文件并将其放入dist/目录中。

pyinstaller.py --help显示一长串选项。

pyinstaller-X.X/doc目录包含 HTML 和 PDF 格式的完整手册。

于 2013-09-17T02:46:05.940 回答
-1

您可以尝试使用 cython 将其转换为 ac 可执行文件

于 2013-08-09T08:33:32.193 回答