将python程序转换为可执行文件

时间:2013-08-09 08:19:17

标签: python pyinstaller

所以现在,我有一个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 failuresNameError: 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 个答案:

答案 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可执行文件