Python 如何在virtualenv中修改pip?
我正在尝试修改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\
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在这里帮不了我。