如何将多个Python源文件连接成一个文件?

时间:2009-10-16 22:30:50

标签: python google-app-engine import module concatenation

(假设:应用程序启动时间绝对至关重要;我的应用程序启动很多;我的应用程序在导入比平常慢的环境中运行;需要导入许多文件;以及编译到.pyc个文件不可用。)

我想将定义模块集合的所有Python源文件连接到一个新的Python源文件中。

我希望导入新文件的结果就像我导入了一个原始文件(然后会导入更多原始文件,依此类推)。

这可能吗?

这是对模块“bar”和“baz”的源文件提供工具可能产生的内容的粗略手动模拟。您可以在部署代码之前运行此类工具。

__file__ = 'foo.py'

def _module(_name):
    import types
    mod = types.ModuleType(name)
    mod.__file__ = __file__
    sys.modules[module_name] = mod
    return mod

def _bar_module():

    def hello():
        print 'Hello World! BAR'

    mod = create_module('foo.bar')
    mod.hello = hello
    return mod

bar = _bar_module()
del _bar_module

def _baz_module():

    def hello():
        print 'Hello World! BAZ'

    mod = create_module('foo.bar.baz')
    mod.hello = hello
    return mod

baz = _baz_module()
del _baz_module

现在你可以:

from foo.bar import hello
hello()

此代码不考虑import语句和依赖项之类的内容。是否有任何现有的代码可以使用它或其他技术来组合源文件?

这与用于在发送到浏览器之前组装和优化JavaScript文件的工具非常相似,其中多个HTTP请求的延迟会损害性能。在这个Python案例中,它是在启动时导入数百个Python源文件的延迟,这会造成伤害。

4 个答案:

答案 0 :(得分:3)

如果这是在谷歌应用引擎上,如标签所示,请确保您使用此成语

def main(): 
    #do stuff
if __name__ == '__main__':
    main()

由于GAE不会在每次请求时重新启动您的应用,除非.py已更改,它只会再次运行main()

这个技巧可以让你编写CGI风格的应用程序而不会影响启动性能

AppCaching

  

如果处理程序脚本提供main()   例程,运行时环境也   缓存脚本。否则,   处理程序脚本为每个加载   请求。

答案 1 :(得分:1)

我认为由于Python文件的预编译和一些系统缓存,你最终得到的速度将无法衡量。

答案 2 :(得分:0)

这样做不太可能产生任何性能优势。您仍在导入相同数量的Python代码,只需要更少的模块 - 而且您牺牲了所有模块化。

更好的方法是修改代码和/或库,只在需要时导入内容,以便为每个请求加载最少的必需代码。

答案 3 :(得分:0)

如果没有处理这个问题,不管这种技术是否可以增强你环境中的东西,说你是对的,这就是我要做的事情。

我会列出所有模块,例如 my_files = ['foo', 'bar', 'baz']

然后我会使用os.path实用程序读取源目录下所有文件中的所有行,并将它们全部写入新文件,过滤所有import foo|bar|baz行,因为所有代码现在都在一个文件中。< / p>

诅咒,最后在文件的尾部添加main() __init__.py(如果有的话)。