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

如何从多个脚本构建单个python文件?,python,Python,我有一个简单的python脚本,它导入了我编写的各种其他模块(等等)。由于我的环境,我的蟒蛇很长。我也在使用Python2.4 我需要做的是以某种方式打包我的脚本和所有不属于标准python的依赖项,以便我可以通过电子邮件将单个文件发送到另一个系统,在那里执行它。我知道python的目标版本是相同的,但它是在linux上,而我在Windows上。否则我就用py2exe 理想情况下,我希望发送一个以某种方式嵌入所有必需模块的.py文件,但我愿意自动构建一个zip,只需解压缩即可,所有必需的模块都在

我有一个简单的python脚本,它导入了我编写的各种其他模块(等等)。由于我的环境,我的蟒蛇很长。我也在使用Python2.4

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

理想情况下,我希望发送一个以某种方式嵌入所有必需模块的.py文件,但我愿意自动构建一个zip,只需解压缩即可,所有必需的模块都在一个目录中

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

[编辑]我似乎很不清楚我在追求什么。我基本上在寻找类似py2exe的东西,它将从给定的python脚本生成一个文件(或两个文件),自动包含所有导入的模块

例如,如果我有以下两个文件:

[\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系统上安装模块。

您应该创建一个egg文件。这是python文件的存档

请参见此问题以获取指导:


更新:考虑轮在2019

< P>你应该创建一个鸡蛋文件。这是python文件的存档

请参见此问题以获取指导:


更新:考虑车轮在2019

< P> >你是否考虑过分配官方包装溶液?

您所做的是为您的程序提供入口点,这些入口点将转换为您可以运行的可执行文件。这样,您不必更改源代码布局,同时仍然可以轻松分发和运行您的程序


您将在

中找到此系统的一个实际应用程序的示例。您是否考虑过分发官方包装解决方案

您所做的是为您的程序提供入口点,这些入口点将转换为您可以运行的可执行文件。这样,您不必更改源代码布局,同时仍然可以轻松分发和运行您的程序


您将在该系统的真实应用程序中找到一个示例,发送单个.py的唯一方法是将所有模块中的代码移动到单个脚本中,并且它们必须重做所有操作以引用新位置

更好的方法是将相关模块移动到与命令相同目录下的子目录中。然后,您可以确保包含模块的子目录中有一个导入主模块文件的
\uuuu init\uuuu.py
。在这一点上,你可以通过它来引用事物

例如:

应用程序目录:
/test

模块目录:
/test/hello

/test/hello/\uuuuuu init\uuuuuuuu.py
内容:

import sayhello
def print_hello():
    print 'hello!'
#!/usr/bin/python2.7

import hello

hello.sayhello.print_hello()
/test/hello/sayhello.py
内容:

import sayhello
def print_hello():
    print 'hello!'
#!/usr/bin/python2.7

import hello

hello.sayhello.print_hello()
/test/test.py
内容:

import sayhello
def print_hello():
    print 'hello!'
#!/usr/bin/python2.7

import hello

hello.sayhello.print_hello()

如果您运行
/test/test.py
您将看到它从现有目录下的模块目录运行print_hello函数,不需要对您的
PYTHONPATH
进行任何更改

发送单个.py的唯一方法是,如果所有不同模块的代码都被移动到单个脚本中,那么它们必须重做所有操作以引用新位置

更好的方法是将相关模块移动到与命令相同目录下的子目录中。然后,您可以确保包含模块的子目录中有一个导入主模块文件的
\uuuu init\uuuu.py
。在这一点上,你可以通过它来引用事物

例如:

应用程序目录:
/test

模块目录:
/test/hello

/test/hello/\uuuuuu init\uuuuuuuu.py
内容:

import sayhello
def print_hello():
    print 'hello!'
#!/usr/bin/python2.7

import hello

hello.sayhello.print_hello()
/test/hello/sayhello.py
内容:

import sayhello
def print_hello():
    print 'hello!'
#!/usr/bin/python2.7

import hello

hello.sayhello.print_hello()
/test/test.py
内容:

import sayhello
def print_hello():
    print 'hello!'
#!/usr/bin/python2.7

import hello

hello.sayhello.print_hello()

如果您运行
/test/test.py
您将看到它从现有目录下的模块目录运行print_hello函数,不需要对您的
PYTHONPATH
进行任何更改

如果您想将脚本及其所有依赖项打包到一个文件中(它不是.py文件),您应该查看。这是一个工具,可以让您构建一个沙盒环境来安装Python包,并管理所有路径、PYTHONPATH和LD_LIBRARY_路径问题,以确保沙盒是完全自包含的

如果您从未安装其他库的virgin Python开始,然后将依赖项安装到虚拟环境中,您将在VirtualEnvironment中创建一个只需要运行Python的项目

沙盒是一个目录树,不是一个文件,但对于分发版,您可以对其进行tar/zip压缩。我从未尝试过分发env,因此可能存在路径依赖,我不确定


相反,您可能需要分发一个构建脚本,用于在目标计算机上构建虚拟环境。是一个帮助自动化该过程的工具,有点像与Python包系统和PyPI紧密集成的“makeinstall”

如果您想将脚本及其所有依赖项打包到一个文件中(它不是.py文件),您应该查看。这是一个工具,可以让您构建一个沙盒环境来安装Python包,并管理所有路径、PYTHONPATH和LD_LIBRARY_路径问题,以确保沙盒是完全自包含的