小编典典

如何从多个脚本构建单个python文件?

python

我有一个简单的python脚本,它导入了我编写的其他各种模块(依此类推)。由于我的环境,我的PYTHONPATH很长。我也在使用Python 2.4。

我需要做的是以某种方式打包我的脚本和所有不属于标准python的依赖项,以便可以将单个文件通过电子邮件发送到要执行该文件的另一个系统。我知道python的目标版本是相同的,但是在Windows上的linux上。否则,我只会使用py2exe。

理想情况下,我想发送一个.py文件,该文件以某种方式嵌入了所有必需的模块,但是我决定自动构建一个zip文件,只需将其解压缩即可,所有必需的模块都位于一个目录中。

我看过各种包装解决方案,但似乎找不到合适的方法。我错过了什么吗?

[编辑]我对所追求的东西似乎还不清楚。我基本上是在寻找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系统上安装我的模块。


阅读 271

收藏
2021-01-20

共1个答案

小编典典

我想出了一个包含模块查找器,编译器和运行良好的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)
2021-01-20