Python预处理导入

时间:2012-03-24 10:56:04

标签: python

我正在管理一个非常大的python代码库(> 2000行),我想要它作为一个可运行的python脚本。所以我正在寻找一种方法或工具来将由不同python文件组成的开发文件夹合并到一个正在运行的脚本中。

我正在搜索的东西/方法应该将代码拆分成不同的文件,可能包含一个包含导入的起始__init___.py文件,并将其合并为一个大的脚本。

很像预处理器。如果是近乎原生的方式,那么最好,如果我可以从dev文件夹运行,那就更好了。

我已经检查了pypp和pypreprocessor,但他们似乎没有采取重点。

奇怪的使用__import__()或者一堆from foo import *被预处理器替换为代码?显然我只想合并我的目录而不是公共库。

更新 我想要的是将代码作为一个包完全保留,然后能够将其“编译”成一个脚本,便于复制 - 粘贴,分发和重用。

2 个答案:

答案 0 :(得分:5)

听起来你问的是如何将你的代码库合并到一个2000多个源文件中 - 你真的,你真的确定要这样做吗?它会使您的代码更难维护。 Python文件对应于模块,因此除非您的主脚本对其所有部分都from modname import *,否则您将通过将模块结构转换为一个文件来丢失模块结构。

我建议将源保持原样,并解决如何分发程序的问题:

  1. 您可以使用PyInstaller,py2exe或类似的东西生成一个甚至不需要安装python的可执行文件。 (如果您可以指望python存在,请参阅下面的@ Sebastian的评论。)

  2. 如果你想分发你的代码库以供其他python程序使用,你绝对应该首先将它构建为一个包,因此它可以加载一个import

  3. 要轻松分发大量的python源文件,您可以将所有内容打包成zip存档或“egg”(实际上是一个带有特殊管家信息的zip存档)。 Python可以直接从zip或egg存档导入模块。

答案 1 :(得分:2)

waffles似乎正是你所追求的,尽管我没有尝试过它

您可以手动执行此操作,例如:

# file1.py
from .file2 import func1, func2
def something():
    func1() + func2()

# file2.py
def func1(): pass
def func2(): pass

# __init__.py
from .file1 import something
if __name__ == "__main__":
    something()

然后,您可以将所有文件连接在一起,删除以from .开头的任何行,并且......它可能会有效。

也就是说,可执行蛋或常规PyPI分发会更简单,更可靠!