2017-01-28 5 views
0

Ich habe ein Python-Programm geschrieben. Und wenn ich eine shebang wie diese haben:Wie aktiviere ich ein Conda env in einer Subshell?

#!/usr/bin/python 

und ich mache die Datei ausführbar mit:

$ chmod 755 program.py 

kann ich das Programm wie so laufen:

$ ./program.py 

Hier die ist Problem. Ich benutze die conda virtual environments. Wenn ich das Programm wie oben ausgeführt, erstellt das System ein Sub-Shell, die nicht die aktive Umgebung erkennt:

(my_env) $ ./program.py 
ImportError: No module named pymongo 

Wenn ich es auf diese Weise tun, aber ...

(my_env) $ python program.py 
# blah blah... runs great 

Wie kann ich angeben die richtige Umgebung für den Einsatz in der Subshell? Ist es möglich? Ich möchte meine Finger die Bemühung der Eingabe der sechs Zeichenkette speichern, die python ist.

Ein weiterer Beitrag, Shebangs in conda managed environments, kurz berührt dies, aber bietet nicht die richtige Antwort. Anstatt die Umgebung in der Subshell zu aktivieren, heißt es nur, mach weiter und ignoriere den Shebang ... benutze einfach die $ python program.py Syntax.

Antwort

3

in Ihrem Skript ändern ...

#!/usr/bin/python 

... bis:

#!/usr/bin/env python 

Der Python durch eine aktivierte Conda Umgebung verwendet wird, ist ${CONDA_PREFIX}/bin/python und der nicht /usr/bin/python

Hinweis Unterschied?

(root) ~/condaexpts$ which python 
/home/ubuntu/condaexpts/m3/bin/python 

(root) ~/condaexpts$ /usr/bin/env python 
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

(root) ~/condaexpts$ source deactivate 

~/condaexpts$ which python 
/usr/bin/python 

~/condaexpts$ /usr/bin/env python 
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
+0

Dank @Nehal, dass es die richtige Antwort gibt. Hat das einen Namen? Nach was suche ich in der Dokumentation? – meh

+0

@meh Es ist ein ziemlich verbreiteter Standard. Gehen Sie auch diese Antwort durch, was erklärt, warum wir diesen Shebang verwenden. http://askubuntu.com/a/88314/95343 –

+0

Gut zu wissen. Vielen Dank! – meh

0

Sie können auch mit der Shebang-Zeile direkt an die Umgebung zeigen, so dass Sie nicht das übergeordnete Umgebung auf etwas vor dem Aufruf des Skripts Einrichtung abhängen müssen.

zunächst Ihre bevorzugte Python-Umgebung Pfad bestimmen:

$ . activate mypython 
$ which python 
/home/username/anaconda/envs/mypython/bin/python  # for example 

es dann in einem Skript verwenden:

#!/home/username/anaconda/envs/mypython/bin/python 
import os,sys 
print sys.executable 
print os.__file__ 

Das obige Skript würde Ausgabe wie folgt geben:

/home/username/anaconda/envs/mypython/bin/python 
/home/username/anaconda/envs/mypython/lib/python2.7/os.pyc 

Having Ein nicht-generischer Befehl im Shebang macht das Skript weniger portabel, aber wenn Sie vom Spezifischen abhängig sind Pakete in einer bestimmten virtuellen Umgebung, das ist, was Sie wollen.

Verwandte Themen