如何让我的Python脚本便于移植?或如何将其编译为包含所有模块依赖的二进制文件?
有没有办法把Python脚本编译成二进制文件?我有一个Python脚本文件,它用到了很多模块。我希望能在其他机器(比如FreeBSD)上使用这个脚本,但不想在每台机器上都安装所有需要的模块。
在这种情况下,有哪些可能的解决方案呢?
4 个回答
2
Python会在当前目录中查找import
模块,所以你不需要把它们安装到Python的目录里。你的文件结构可能看起来像这样:
main.py
module1/
__init__.py, ...
module2/
__init__.py, ...
其中main.py文件里有import module1, module2
的代码。
3
cx_freeze 是一个工具,它可以把你的 Python 脚本打包成一个独立的程序。这个程序会包含一个 Python 加载器和一些需要的共享库。这样,你就可以把打包好的程序复制到其他电脑上,而不需要在那些电脑上安装 Python 或者你的模块。
$ cat hello.py
print "Hello, World!"
$ ls dist/
datetime.so _heapq.so hello libpython2.6.so.1.0 readline.so
$ cat hello.py
print "Hello, World!"
$ cxfreeze hello.py
... <snip> ...
$ ls dist/
datetime.so _heapq.so hello libpython2.6.so.1.0 readline.so
$ ./dist/hello
Hello, World!
一个更好的方法可能是创建一个 PIP 包,这样可以把这些第三方模块标记为依赖项。这样安装就变得非常简单,只需要输入 "pip install mypackage; ./package" 就可以了。
20
可以满足你需求的程序有:
- PyInstaller: http://www.pyinstaller.org/ [适用于Windows、Linux和OS X]
- cx_freeze: http://cx-freeze.sourceforge.net/ [适用于Windows和Linux]
- py2exe: http://www.py2exe.org/ [适用于Windows]
- py2app: http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html [适用于OS X]
不过,正如之前提到的,你还可以使用Distribute来创建一个包,并把其他包作为依赖。然后你可以用 pip
来安装这个包,它会自动安装所有依赖的包。不过,你还是需要先安装Python和pip。