我有一个简单的python脚本,它导入了我编写的各种其他模块(等等)。由于我的环境,我的PYTHONPATH是相当长的。我也在使用Python2.4。
我需要做的是以某种方式打包我的脚本和所有不是标准python一部分的依赖项,这样我就可以通过电子邮件将单个文件发送到我想要执行它的另一个系统。我知道python的目标版本是一样的,但它是在linux上,而我在Windows上。否则我只会使用py2exe。
理想情况下,我希望发送一个以某种方式嵌入所有所需模块的.py文件,但我会满足于自动构建一个只需解压缩的压缩文件,所需的模块都在一个目录中。
我已经看过各种包装解决方案,但我似乎找不到一种合适的方法来做到这一点。我错过了什么吗?
编辑我似乎不太清楚我想要的是什么。我基本上是在寻找像py2exe这样的东西,它将从给定的python脚本中产生一个文件(或2个文件),自动包含所有导入的模块。
例如,如果我有以下两个文件:
[\foo\module.py]
def example():
print "Hello"
[\bar\program.py]
import module
module.example()
然后我跑起来:
cd \bar
set PYTHONPATH=\foo
program.py
那么它就会起作用。我想要的是能够说:
magic program.py
最后得到一个文件,或者可能是一个文件和一个zip文件,然后我可以将其复制到linux上并运行。我不想在目标linux系统上安装我的模块。
发布于 2012-11-02 10:01:33
我已经想出了一个解决方案,它涉及到modulefinder、编译器和zip函数,运行良好。不幸的是,我不能在这里粘贴工作程序,因为它与其他无关的代码混合在一起,但这里有一些代码片段:
zipfile = ZipFile(os.path.join(dest_dir, zip_name), 'w', ZIP_DEFLATED)
sys.path.insert(0, '.')
finder = ModuleFinder()
finder.run_script(source_name)
for name, mod in finder.modules.iteritems():
filename = mod.__file__
if filename is None:
continue
if "python" in filename.lower():
continue
subprocess.call('"%s" -OO -m py_compile "%s"' % (python_exe, filename))
zipfile.write(filename, dest_path)
发布于 2014-06-10 23:40:39
我发现这很有用:
http://blog.ablepear.com/2012/10/bundling-python-files-into-stand-alone.html
简而言之,您可以.zip您的模块并在其中包含一个__main__.py
文件,这将使您能够像这样运行它:
python3 app.zip
因为我的应用很小,所以我做了一个从我的主脚本到__main__.py
的链接。
附录:
您还可以通过在文件顶部添加一行代码,使zip在类UNIX系统上成为自执行文件。这对于使用Python3的脚本可能很重要。
echo '#!/usr/bin/env python3' | cat - app.zip > app
chmod a+x app
,现在无需指定python即可执行。
./app
发布于 2017-03-13 13:22:44
使用stickytape模块
stickytape scripts/blah --add-python-path . > /tmp/blah-standalone
这将产生一个正常运行的脚本,但不一定是人类可读的。
https://stackoverflow.com/questions/9002275
复制相似问题