Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python依赖关系?_Python_Svn_Dependencies_Detection - Fatal编程技术网

Python依赖关系?

Python依赖关系?,python,svn,dependencies,detection,Python,Svn,Dependencies,Detection,给定驻留在SVN中的python项目,是否可以通过编程方式检测依赖项?绝对可以!如果您使用的是UNIX或Linux shell,那么将grep和awk简单组合即可;基本上,您只需搜索包含“import”关键字的行 但是,如果您在任何环境下工作,您只需编写一个小型Python脚本来执行搜索(不要忘记字符串被视为不可变序列,因此您可以执行类似于的操作,如果在第行中“导入”…) 一个棘手的问题是将那些imported模块与其包名相关联(首先想到的是PIL模块,在Ubuntu中,它是由python im

给定驻留在SVN中的python项目,是否可以通过编程方式检测依赖项?

绝对可以!如果您使用的是UNIX或Linux shell,那么将
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