如何通过解析导入来组合并获取单个Python文件

时间:2014-01-16 13:37:48

标签: python

我正在尝试将单个Python文件作为输出。我有一个Python脚本,有几种类型的导入:

from that import sub

导入来自所有本地模块,而不是来自系统或Python库。有没有办法解决这些并获得一个完整的代码文件?也就是说,我可以将所有方法/函数定义包含在最终文件中吗?

我可以手动执行此操作,但有很多导入。有没有办法做到这一点?

我的Python版本是2.4.3。

4 个答案:

答案 0 :(得分:2)

如果要在单个文件中包含所有导入,可以尝试附加路径。

import sys
sys.path.insert(0,'path/to/your/folder/containing/file/to/be/imported')
import your_module

答案 1 :(得分:2)

看来,大多数回答的人没有正确地回答问题(我希望,我做到了)。问题不在于如何避免多次导入" ...它是关于:"如何从多个python模块获取单个python脚本?"

我有同样的问题。用例如下:

我使用基于Web的GUI为某些系统开发了一些扩展。扩展名是用python编写的。系统本身通过其python API公开了它的一些功能。但由于系统的限制,它只能用于单文件模块。即我必须将所有代码保存在一个文件中。另一方面,脚本往往变得相当复杂(数千行),并且还希望使用某种比复制粘贴更智能的机制重用一些常用函数(日志记录,错误处理等)。

我想到的是通常使用模块进行开发。然后使用一些" builder",它将把特定最终用法脚本中使用的所有模块组合在一起,并将它们组合成单个文件。

现在问题是:这样的"建设者"存在?

注意,使用py2exe不是一个选项,因为我需要python源文件作为输出。

我发现的唯一现成解决方案是在here以上的jonrsharpe已经提到的讨论中给出的。

这是Breeder工具。诚实,我没有尝试过,但根据描述它应该做所需要的。

就我而言,我决定开发自己的工具,它可以处理一些特殊点(例如在异常陷阱中打印出正确的行号等)。但它仍在进行中,所以我现在无法分享它。

答案 2 :(得分:0)

您可以将所有模块移动到一个目录,然后执行from thatdir import *。然后,每次要将任何模块添加到此目录时,您只需编辑__init__.py即可包含该模块。请参阅以下目录结构,脚本和执行

# Putting All my modules in `MyModule` directory

[root@Machine python]# cd MyModule/
[root@Machine MyModule]# pwd
/python/MyModule
[root@Machine MyModule]# ls -l
total 32
-rw-r--r--. 1 root root  46 Jan 16 06:35 __init__.py
-rw-r--r--. 1 root root 178 Jan 16 06:36 __init__.pyc
-rw-r--r--. 1 root root  48 Jan 16 06:36 ModuleA.py
-rw-r--r--. 1 root root 267 Jan 16 06:37 ModuleA.pyc
-rw-r--r--. 1 root root  42 Jan 16 06:36 ModuleB.py
-rw-r--r--. 1 root root 261 Jan 16 06:37 ModuleB.pyc
-rw-r--r--. 1 root root  44 Jan 16 06:37 ModuleC.py
-rw-r--r--. 1 root root 263 Jan 16 06:37 ModuleC.pyc

# Including modules to be imported by * import in __init__.py

[root@Machine MyModule]# cat __init__.py
__all__ = [ "ModuleA", "ModuleB", "ModuleC" ]
[root@Machine MyModule]#

# Sample Script showing import of these modules in one statement 
[root@Machine MyModule]# cd ..
[root@Machine python]# cat myscript.py
from MyModule import *

ModuleA.printHello()
ModuleB.printHi()
ModuleC.printHey()

# Execution of script
[root@Machine python]# python myscript.py
Hello from Module A
Hi from Module B
Hey from Module C
[root@Machine python]#

这样您就不必创建包含所有函数的新文件,并且您只获得一个import语句。

答案 3 :(得分:0)

我不相信有一种内置的方法可以做到这一点。我实际上写了一个(非常天真)的工具来自动完成这项工作,但这只是因为我实际上需要相对经常地工作(创建单文件Python脚本)。但是,该工具本身并不是特别便携;它有很多挑剔的位,对源代码提出了很多要求,而且它肯定与Python 2.4不兼容。

如果您只打算做一次,您会发现手动复制非核心源模块要容易得多。

或者,如果不要求保持跨平台,则可以查看pyinstaller,它使用Python代码生成可执行二进制文件。这可以将所有内容整合到一个文件中,而无需您进行大量的源代码操作。