【问题标题】:Is it possible to get pip to print the configuration it is using?是否可以让 pip 打印它正在使用的配置?
【发布时间】:2016-08-02 20:15:14
【问题描述】:

有没有办法让 pip 打印它将尝试使用的配置?出于调试目的,很高兴知道:

  1. config.ini 文件位于正确的位置,并且 pip 正在查找它们。
  2. 配置设置的优先级按照人们对docs 所期望的方式进行处理

【问题讨论】:

  • 你的意思是 pip.conf 文件吗?
  • 是的,与 pip.conf 文件等效的 Windows 是一个名为 'pip' 的父目录中的 config.ini 文件。

标签: python pip


【解决方案1】:

适用于 10.0.x 及更高版本

有新的pip config 命令,用于列出当前配置值

pip config list

(正如 @wmaddox 在 cmets 中指出的那样)获取 pip 查找配置文件的列表

pip config list -v

10.0.x 之前

您可以启动 python 控制台并执行此操作。 (如果你有 virtaulenv,别忘了先激活它)

from pip import create_main_parser
parser = create_main_parser()
# print all config files that it will try to read
print(parser.files)
# reads parser files that are actually found and prints their names 
print(parser.config.read(parser.files))

create_main_parser 是创建parser 的函数,pip 使用该函数从命令行读取参数(optparse)并加载配置(configparser

可能的配置文件名在get_config_files 中生成。包括PIP_CONFIG_FILE 环境变量(如果已设置)。

parser.configRawConfigParser 的实例,所以get_config_files 中生成的所有文件名都传递给parser.config.read .

尝试读取和解析文件名列表,返回成功解析的文件名列表。如果 filenames 是字符串,则将其视为单个文件名。如果无法打开以文件名命名的文件,则该文件将被忽略。这样做的目的是让您可以指定潜在配置文件位置的列表(例如,当前目录、用户的主目录和一些系统范围的目录),并且将读取列表中的所有现有配置文件。如果不存在任何命名文件,则 ConfigParser 实例将包含一个空数据集。需要从文件加载初始值的应用程序应在为任何可选文件调用 read() 之前使用 read_file() 加载所需的文件:

【讨论】:

  • 我认为这很有用,但它似乎只是打印它可能使用的文件。例如,如果我在我的 Mac 上运行它,我会得到 ['/Library/Application Support/pip/pip.conf', '/Users/myuser/.pip/pip.conf', '/Users/myuser/Library/Application Support/pip/pip.conf'],但实际上这些文件都不存在。是否有一些日志记录或任​​何东西可以让 pip 打印出它试图读取的文件以及它是否成功?
  • @Freg 我扩展了我的答案。我有一些问题要问你。您如何尝试传递您的config.iniget_config_files 读取 PIP_CONFIG_FILE 环境变量,你设置正确了吗?你在用 virtualenv 吗?
  • 我试图弄清楚 if 它使用的是 pip.conf、pip.ini、conf.ini 等...如果是,它在哪里.您的更新似乎涵盖了我正在寻找的内容;谢谢。
  • 通过上面的例子可以很容易地转换成脚本。可以运行哪个来显示你想要的信息。
  • 请注意...pip search 似乎总是使用 PyPi.org,即使您的 pip.conf 已正确配置为使用私有镜像。今天早些时候我在尝试调试问题上浪费了令人尴尬的很长一段时间。
【解决方案2】:

您可以在 pdb 中运行 pip。这是 ipython 内部的一个示例:

>>> import pip
>>> import pdb
>>> pdb.run("pip.main()", globals())
(Pdb) s
--Call--
> /usr/lib/python3.5/site-packages/pip/__init__.py(197)main()
-> def main(args=None):
(Pdb) b /usr/lib/python3.5/site-packages/pip/baseparser.py:146
Breakpoint 1 at /usr/lib/python3.5/site-packages/pip/baseparser.py:146
(Pdb) c
> /usr/lib/python3.5/site-packages/pip/baseparser.py(146)__init__()
-> if self.files:
(Pdb) p self.files
['/etc/xdg/pip/pip.conf', '/etc/pip.conf', '/home/andre/.pip/pip.conf', '/home/andre/.config/pip/pip.conf']

这里唯一的技巧是查找 baseparser 的路径(并知道文件在那里)。如果您还不知道这一点,您可以简单地单步执行程序或阅读源代码。这种类型的探索应该适用于大多数 Python 程序。

【讨论】:

    【解决方案3】:

    在我看来,你的问题可以从三个方面来解读:

    1. pip 可执行文件的配置是什么?

    pip 支持的配置有相当广泛的文档,请参阅此处:https://pip.pypa.io/en/stable/user_guide/#configuration

    1. pip 在配置和随后构建 Python 模块所需的代码时使用什么配置?

    这是由正在安装的软件包指定的。包维护者负责生成配置脚本。例如,Numpy 有一个配置类 (https://github.com/numpy/numpy/blob/master/numpy/distutils/misc_util.py),用于配置 Cython 构建。

    1. 当前使用 pip 安装了哪些模块,以便我可以重现特定的环境配置?

    这很简单,pip freeze > requirements.txt。这将生成所有当前安装的 pip 模块及其确切版本的文件。然后,您可以通过 pip install -r requirements.txt 在另一台机器上重现该确切的环境配置。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多