列出应用程序使用的Python包
def get_pkgs():
pkgs = []
for importer, modname, ispkg in \
pkgutil.walk_packages(path=None, onerror=lambda x: None):
pkgs.append(modname)
return pkgs
上面的代码片段可以让我看到所有的Python包。有没有人能告诉我,怎么才能找出这些包中,哪个是被某个Python应用程序使用的呢?
2 个回答
1
最简单的方法是使用一个叫做 snakefood 的Python依赖分析工具。
1
Snakefood 是一个不错的工具,正如Sven Marnach所说的那样,但它会列出所有文件的依赖关系,我不太确定它是否只会告诉你使用了哪些包,而不是每一个文件的依赖。
对于在Python包索引中可用的包,你可以使用virtualenv(还有pip,它是随virtualenv一起提供的)来获取一个简单的所需/使用包的列表。
例如,假设你已经安装了很棒的virtualenvwrapper工具(强烈推荐),下面是一个显示pylint包需求的步骤:
$ mkvirtualenv pylint_dep_check --no-site-packages New python executable in pylint_dep_check/bin/python Installing setuptools............done. $ pip freeze #Note the wsgiref 'bug' where it always shows up wsgiref==0.1.2 $ workon pylint_dep_check (pylint_dep_check) $ pip install pylint (... snipped lengthy install text ...) (pylint_dep_check) $ pip freeze logilab-astng==0.21.1 logilab-common==0.55.0 pylint==0.23.0 unittest2==0.5.1 wsgiref==0.1.2
注意使用了非常重要的--no-site-packages
选项来创建virtualenv,这样(惊喜!)可以确保你的virtualenv是全新的,没有安装任何来自你系统的包。这样就能清楚地知道你安装的应用需要什么。
如果这是你自己开发的应用,一个很好的方法来跟踪你的依赖关系(也是一种非常干净的工作方式)是把应用设置在一个干净的virtualenv中(再次使用--no-site-packages
选项),然后再用pip freeze
来找出你安装了哪些包来让它正常工作。
使用--no-site-packages
选项启动一个“全新”的Python安装是非常有用的。我对所有应用都这样做,也用来测试我感兴趣的包,而不会让我的工作空间变得杂乱。
如果你还没有使用virtualenv和pip,快去试试吧。这里有一个很好的介绍:http://mathematism.com/2009/07/30/presentation-pip-and-virtualenv/