Python 如何在virtualenv中修改pip?

Python 如何在virtualenv中修改pip?,python,pip,virtualenv,Python,Pip,Virtualenv,我正在尝试修改pip,以便在每次安装或卸载后,我的requirements.txt都会得到更新 为此,我修改了虚拟环境的bin/中的pip文件 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\

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

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

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())
#!/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())
这不管用。我曾尝试打印命令行参数并设置断点,但效果并不理想

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())
#!/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())

我做错了什么?

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

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')

问题是我修改了错误的文件。我在
ProjectEnv/bin/
中修改了
pip
,但这不是我键入的文件,比如说,
pip安装一些模块时执行的文件

发现这一点花了一段时间,因为
哪个pip
输出了
/Users/username/ProjectEnv/bin/pip

类型pip
显示了真相。它输出:
pip别名为“pip3”


因此,这是一个很好的例子,说明了为什么我们应该将
which
别名为
type
。或者,为什么我们应该停止使用
而始终使用
类型
,我认为您最好使用bash脚本,比如
pip\u with\u autofreeze.sh

#!/usr/bin/env sh
pip $@ && pip freeze > requirements.txt
例如,使用
/pip\u和\u autofreeze.sh install flask运行它


将脚本放置在
$PATH
中某个合适的位置,如
~/bin
,您可以在将来创建的任何virtualenv中调用它们。Pip将引用virtualenv指向的任何对象。

您确定您的意思不是
status==0
status为None
。。而不仅仅是
=
?如果您使用了粘贴的语法,则它既不是有效的py2代码,也不是有效的py3代码,因此我认为您的代码根本没有被调用。@MatsLindh修复了它们,但仍然不起作用。您是否在virtualenv处于活动状态时对其进行了测试?因为那样对我不起作用,“它不起作用”是没有帮助的。它在做什么你不期望的事情?附加的代码根本没有被执行。它被视为不存在。@Utku,这是我对你实际问题的评论-如果你有你在那里展示的语法,并且没有出现错误,你实际上并没有调用你认为正在调用的代码。@MatsLindh我也这么认为。但是
哪个pip
显示
/Users/username/ProjectEnv/bin/pip
。但你是对的。对于我的代码的第一个版本,如果我没有得到语法错误,那么该代码就不会被执行。但是,我怎样才能找到正在执行的代码呢
哪个pip在这里帮不了我。