获取Django项目使用的Python包列表

17

有没有一种简单的方法来获取Django项目使用的Python包列表?

我已经查看了snakefood和这个问题,但是似乎都不能在Django环境中很好地运行。

理想情况下,我正在寻找一条命令,可以从python shell或bash中执行,以列出所有不是Django本地支持的pypy依赖项。


grep import -r /path/to/your/django/project在你的Django项目路径下,使用grep命令查找导入(import)相关的代码。 - Tom O'Connor
@TomO'Connor 我曾经尝试过使用grep,但无法弄清楚如何将其精炼到只打印我的导入语句。即使这样做,也仍然很难通过所有内容并找出哪些是真正的非本地包。 - Daniel Nill
1
仅使用“grep import…”是不够的。那么那些使用“from x import y”导入的呢?此外,还有从settings.INSTALLED_APPS加载的应用程序(及其依赖项),这些应用程序可能是Django项目之外的外部应用程序。 - Shawn Chin
4个回答

7
也许这对于使用“pip”安装依赖库的项目会有所帮助:
pip freeze

8
这只会显示已安装的内容,而不是正在使用的内容。特别是在使用多个项目共享环境时可能会出现问题。 - Oli

7
这不是一个完整的答案,但希望它能成为一个合理的起点。
就我所知,一个 Django 项目的依赖关系(除了 Django 本身和它的依赖项*)由以下组成:
1. 您的 Django 项目导入的模块 2. 通过 settings.INSTALLED_APPS 加载的应用程序(以及它们的依赖项)
#1 您的项目导入的模块
您可以使用 snakefood 来发现这一点。
#2 通过 settings.INSTALLED_APPS 加载的应用程序
运行以下脚本应该会给出列在 INSTALLED_APPS 中的应用程序路径:
#!/usr/bin/env python
from settings import INSTALLED_APPS
from django.utils.importlib import import_module
import os

app_names = (x for x in INSTALLED_APPS if not x.startswith('django'))
app_paths = (os.path.dirname(os.path.abspath(import_module(x).__file__)) for x in app_names)    
print "\n".join(x for x in app_paths if not x.startswith(os.getcwd()))

你可以将这个传递给snakefood来发现它们的依赖关系。
* 为了更加彻底,应该能够从settings中发现各种后端(db/cache/auth等),并将相关模块包含在你的依赖列表中。

3
在你的Django项目中运行此命令,它会将所有安装的软件包写入requirements.txt文件中。
 pip freeze > requirements.txt

或者如果您使用的是Python3,则可以像这样使用pip3。
pip3 freeze > requirements.txt

你会在Django项目的内部找到requirements.txt文件。


您假定正在使用虚拟环境。如果不是这种情况,它将写入所有系统安装的软件包,这可能不是用户想要的。 - Joel G Mathew

2

pigar 对我来说很好用。

它还没有覆盖 INSTALLED_APPS,但只需要额外的一点工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接