如何以编程方式获取Python包的依赖项列表?
标准setup.py有这些记录,但我找不到从 Python或命令行访问它的简单方法.
理想情况下,我正在寻找类似的东西:
$ pip install somepackage --only-list-deps
kombu>=3.0.8
billiard>=3.3.0.13
boto>=2.26
Run Code Online (Sandbox Code Playgroud)
要么:
>>> import package_deps
>>> package = package_deps.find('somepackage')
>>> print package.dependencies
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26']
Run Code Online (Sandbox Code Playgroud)
注意,我不是在谈论导入包和查找所有引用的模块.虽然这可能会找到大多数依赖包,但它无法找到所需的最小版本号.那只存储在setup.py中.
我想看一个依赖于某个包含PIP的软件包列表.也就是说django,我希望看到django-cms,django-filer因为我安装了这些软件包并且它们都具有django依赖性.
假设python包A需要B,C和D; 有没有办法列出A→BCD而不加载它们?
Requires在metadata(yolk -M A)中经常是不完整的,grr.
可以下载A.tar/A.egg,然后查看A/setup.py,但其中一些非常血腥.
(我认为至少可以获得一级依赖关系;即使是98%的解决方案也会比雪崩下载更好.)
包管理器JavaScript喜欢npm和yarn使用 apackage.json来指定“顶级”依赖项,并创建一个锁定文件来跟踪作为结果安装的所有包(即顶级和子级依赖项)的特定版本。
此外,package.json允许我们区分顶级依赖项的类型,例如production和development。
对于Python,另一方面,我们有pip。我想pip相当于一个lock-file 将是pip freeze > requirements.txt.
但是,如果您只维护这个单个requirements.txt文件,则很难区分顶级和子级依赖项(例如pipdeptree -r,您需要弄清楚这些)。如果您想删除或更改顶级依赖项,这可能会很痛苦,因为很容易留下孤立的包(据我所知,当您创建一个包时,pip 不会删除子依赖项pip uninstall)。
现在,我想知道:是否有一些约定来处理这些requirements文件的不同类型并区分顶级和子级依赖关系pip?
例如,我可以想象有 arequirements-prod.txt只包含生产环境的顶级要求,作为 , 的(简化)等价物package.json,而 arequirements-prod.lock包含 , 的输出pip freeze,并充当我的 -lock文件。此外,我可以有一个requirements-dev.txt用于开发的依赖项,等等。
我想知道这是要走的路,还是有更好的方法。
ps 同样的问题可以问conda …
这个命令在我的个人计算机上工作正常但在我的工作PC上一直给我这个错误.会发生什么事?我可以直接在Powershell中运行Char_Limits.py脚本而不会出现问题.错误:编译'C:\ ProgramData\Anaconda2\lib\site-packages\jinja2\asyncsupport.py'失败语法错误:语法无效(asyncsupport.py,第22行)
我的setup.py文件如下所示:
from distutils.core import setup
import py2exe
setup (console=['Char_Limits.py'])
Run Code Online (Sandbox Code Playgroud)
我的文件看起来像:
import xlwings as xw
from win32com.client import constants as c
import win32api
"""
Important Notes: Header row has to be the first row. No columns without a header row. If you need/want a blank column, just place a random placeholder
header value in the first row.
Product_Article_Number column is used to determine the number of rows. It must be populated for every row.
"""
#functions, hooray!
def setRange(columnDict, …Run Code Online (Sandbox Code Playgroud)