2017-01-14 3 views
1

Ich versuche, pip zu ändern, so dass nach jeder Installation oder Deinstallation, meine requirements.txt aktualisiert wird.Wie pip in einem virtualenv ändern?

Um dies zu tun, habe ich die pip Datei in der bin/ meines virtuellen env geändert.

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

Das hat nicht funktioniert. Ich habe versucht, die Befehlszeilenargumente zu drucken und einen Haltepunkt zu setzen, aber sie haben nicht so gut funktioniert.

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

Was mache ich hier falsch?

+0

Sind Sie sicher, dass Sie nicht "Status == 0" und "Status ist keiner" bedeuten .. und nicht nur '='? Wenn Sie die von Ihnen eingefügte Syntax verwendet haben, handelt es sich weder um einen gültigen py2- noch um einen py3-Code. Ich glaube also nicht, dass Ihr Code überhaupt aufgerufen wird. – MatsLindh

+0

@MatsLindh Fixed sie, aber immer noch nicht funktioniert. – Utku

Antwort

1

Sie können einfach die freeze Methode selbst auf der Pip-Bibliothek aufrufen. Es wird einen Generator zurückgeben, der Ihnen die zeilenweise Ausgabe dessen liefert, was auf dem Bildschirm in pip --freeze gedruckt wird.

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

Funktioniert nicht für mich. Hast du es getestet? – Utku

+0

Der Code für freeze.freeze, ja. – 2ps

+0

Hast du es getestet, während ein virtualenv aktiv ist? Weil es auf diese Weise nicht funktioniert. – Utku

0

Das Problem war, dass ich die falsche Datei änderte. Ich änderte die pip in ProjectEnv/bin/, aber das war nicht die Datei ausgeführt wird, wenn ich z. B. pip install some_module eingegeben.

Es hat eine Weile gedauert, um dies zu entdecken, weil which pip auch /Users/username/ProjectEnv/bin/pip ausgegeben wurde.

type pip hat die Wahrheit gezeigt. Es ausgegeben: pip is aliased to 'pip3'.

Also, das ist ein schönes Beispiel dafür, warum wir Alias ​​which zu type Alias ​​sollten. Oder warum sollten wir aufhören, which überhaupt zu verwenden und immer type verwenden.

0

Ich glaube, Sie würden mit einem Bash-Skript besser dran, wie pip_with_autofreeze.sh:

#!/usr/bin/env sh 
pip [email protected] && pip freeze > requirements.txt 

Run mit ./pip_with_autofreeze.sh install flask, zum Beispiel.

Platzieren Sie das Skript an einem geeigneten Ort von Ihrem $PATH wie ~/bin, und Sie können es von jedem virtualenv, das Sie in der Zukunft erstellen. Pip bezieht sich auf das, worauf der virtualenv es hinweist.

Verwandte Themen