如何在virtualenv中修改pip?

时间:2017-01-14 11:35:50

标签: python pip virtualenv

我正在尝试修改pip,以便在每次安装或卸载后,我的requirements.txt都会更新。

为此,我修改了虚拟环境pip中的bin/文件。

pip

#!/Users/username/ProjectEnv/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    status = main()
    if status == 0 or status is None:
        sys.argv = ['pip', 'freeze', '>', '../Project/requirements.txt']
        sys.exit(main())

这没有用。我尝试打印命令行参数并设置断点,但它们也不起作用。

pip

#!/Users/username/ProjectEnv/bin/python3

# -*- coding: utf-8 -*-
import re
import sys
import pdb
pdb.set_trace()

from pip import main

if __name__ == '__main__':
    for arg in sys.argv:
        print(arg)
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    status = main()
    if status == 0 or status is None:
        sys.argv = ['pip', 'freeze', '>', '../Project/requirements.txt']
        sys.exit(main())

我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

您可以在pip库上自行调用freeze方法。它将返回一个生成器,该生成器为您提供在pip --freeze中打印到屏幕上的内容的逐行输出。

from pip.operations import freeze

packages = freeze.freeze()
with open('../Project/requirements.txt', 'w') as f:
    for x in packages:
        f.write(x)
        f.write('\n')

答案 1 :(得分:0)

问题是我正在修改错误的文件。我修改了pip中的ProjectEnv/bin/,但这不是我输入的文件,例如pip install some_module

发现这一点需要一段时间,因为which pip也输出了/Users/username/ProjectEnv/bin/pip

type pip已经证明了事实。它输出:pip is aliased to 'pip3'

所以,这是一个很好的例子,说明为什么我们应该which别名type。或者,为什么我们应该停止使用which并始终使用type

答案 2 :(得分:0)

我认为使用 pip_with_autofreeze.sh 等bash脚本会更好:

#!/usr/bin/env sh
pip $@ && pip freeze > requirements.txt

例如,使用./pip_with_autofreeze.sh install flask运行它。

将脚本放在$PATH ~/bin之类的适当位置,您可以从以后创建的任何virtualenv中调用它。 Pip将引用virtualenv所指出的任何内容。