Python依赖关系?
给定驻留在SVN中的python项目,是否可以通过编程方式检测依赖项?绝对可以!如果您使用的是UNIX或Linux shell,那么将Python依赖关系?,python,svn,dependencies,detection,Python,Svn,Dependencies,Detection,给定驻留在SVN中的python项目,是否可以通过编程方式检测依赖项?绝对可以!如果您使用的是UNIX或Linux shell,那么将grep和awk简单组合即可;基本上,您只需搜索包含“import”关键字的行 但是,如果您在任何环境下工作,您只需编写一个小型Python脚本来执行搜索(不要忘记字符串被视为不可变序列,因此您可以执行类似于的操作,如果在第行中“导入”…) 一个棘手的问题是将那些imported模块与其包名相关联(首先想到的是PIL模块,在Ubuntu中,它是由python im
grep
和awk
简单组合即可;基本上,您只需搜索包含“import
”关键字的行
但是,如果您在任何环境下工作,您只需编写一个小型Python脚本来执行搜索(不要忘记字符串被视为不可变序列,因此您可以执行类似于的操作,如果在第行中“导入”…
)
一个棘手的问题是将那些
import
ed模块与其包名相关联(首先想到的是PIL
模块,在Ubuntu中,它是由python imaging
包提供的).Python代码可以使用运行时构造的字符串导入模块,因此唯一可靠的方法是运行代码。现实世界的示例:当您使用SQLAlchemy的dbconnect
打开数据库时,库将根据数据库字符串的内容加载一个或多个db api模块
如果您愿意运行代码,这里有一个相对简单的方法,可以在代码完成时检查代码:
>>> from sys import modules
>>> import codeofinterest
>>> execute_code_of_interest()
>>> print modules
[ long, list, of, loaded, modules ]
在这里,您也应该记住,如果
execute\u-code\u-of-u-interest()
修改sys.modules
,但我相信这在生产代码中是非常罕见的。这里有一个技巧,它增加了一些精度,如果您发现经常检查杂项代码的依赖关系,这可能会很有用:
- 仅捕获由正在分析的代码执行的导入语句
- 自动排除所有系统加载的模块,因此您不必对其进行筛选
- 还报告从每个模块导入的符号
foobar
模块:
import byteplay
import cjson
def _other():
from os import path
from sys import modules
def do_something():
import hashlib
import lxml
_other()
输出:
modules and symbols imported by "foobar":
_hashlib
array
array
byteplay
cStringIO
StringIO
cjson
dis
findlabels
foobar
hashlib
itertools
lxml
opcode
*
__all__
operator
os
path
sys
modules
types
warnings
这样做的一个好方法是记住程序开始时加载的模块列表,然后将其与最后加载的列表进行比较。您可以使用集合并减去它们,例如
set(modules)-set(modules\u at\u start)
。
modules and symbols imported by "foobar":
_hashlib
array
array
byteplay
cStringIO
StringIO
cjson
dis
findlabels
foobar
hashlib
itertools
lxml
opcode
*
__all__
operator
os
path
sys
modules
types
warnings