web-dev-qa-db-fra.com

ce que Shebang à utiliser pour les scripts python exécutés sous pyenv virtualenv

Lorsqu'un script python est supposé être exécuté à partir d'une pyenvvirtualenv, quel est le Shebang correct pour le fichier?

Comme exemple de scénario de test, pandas n'est pas installé sur le système Python par défaut de mon système (OSX). Pyenv virtualenv venv_name fait. J'ai essayé d'obtenir le chemin de l'exécutable python à partir de virtualenv.

$ pyenv activate venv_name
(venv_name)$ which python
/Users/username/.pyenv/shims/python


J'ai donc créé mon exemple script.py:

#!/Users/username/.pyenv/shims/python
import pandas as pd
print 'success'


Mais quand j'ai essayé de lancer le script, j'ai eu une erreur:

(venv_name) $ ./script.py
./script.py: line 2: import: command not found
./script.py: line 3: print: command not found


Bien que l’exécution de ce chemin sur la ligne de commande marche bien:

(venv_name) $ /Users/username/.pyenv/shims/python script.py
success

(venv_name) $ python script.py # also works
success

Quel est le bon Shebang pour cela? Idéalement, je veux quelque chose de générique pour qu'il pointe vers le python de ce que je suis actuellement.

20
xgord

Je ne sais pas vraiment pourquoi appeler l'interprète avec le chemin complet ne fonctionnerait pas, je l'utilise tout le temps, mais si vous voulez utiliser l'interpréteur python présent dans votre environnement, vous devez procéder comme suit:

#!/usr/bin/env python

De cette façon, vous recherchez dans votre environnement l’interpréteur python à utiliser.

30
DSLima90

Si vous devez utiliser plus de Shell que vous ne pouvez en placer dans la ligne #! Shebang, vous pouvez démarrer le fichier avec un simple script de shell qui lance Python sur le même fichier.

#!/bin/bash
"exec" "pyenv" "exec" "python" "$0" "$@"
# the rest of your Python script can be written below

A cause des guillemets, Python n'exécute pas la première ligne, mais joint plutôt les chaînes pour le module docstring ... qui l'ignore.

Vous pouvez voir plus ici .

4
ephemient

Comme vous vous y attendiez, vous devriez pouvoir utiliser le chemin d'accès complet au python de l'environnement virtuel dans Shebang pour choisir/contrôler l'environnement dans lequel le script s'exécute, quel que soit l'environnement du script de contrôle. 

Dans les commentaires sur votre question, VPfB & vous trouvez que le /Users/username/.pyenv/shims/python est un script shell qui effectue un exec $pyenv_python. Vous devriez être capable de echo $pyenv_python pour déterminer le vrai python et l'utiliser comme votre Shebang. 

Voir aussi: https://unix.stackexchange.com/questions/209646/how-to-activate-virtualenv-when-a-python-script-starts

Essayez pyenv virtualenvs pour trouver une liste de répertoires d’environnement virtuel.

Et puis vous pourriez trouver un Shebang utilisant quelque chose comme ceci: 

#!/Users/username/.pyenv/python/versions/venv_name/bin/python
import pandas as pd
print 'success'

... permettra au script de fonctionner en utilisant l'environnement virtuel choisi dans d'autres environnements (virtuels ou non):

(venv_name) $ ./script.py 
success
(venv_name) $ pyenv activate non_pandas_venv 
(non_pandas_venv) $ ./script.py
success
(non_pandas_venv) $ . deactivate
$ ./script.py
success
$

Le truc, c'est que si vous appelez spécifiquement le binaire python de l'environnement virtuel, python recherche l'emplacement des chemins de ce binaire pour les fichiers de support et finit par utiliser l'environnement virtuel environnant. (Voir per Comment fonctionne virtualenv? )

2
Dave X

vous devez peut-être vérifier les privilèges de fichier:

Sudo chmod +x script.py
0
sadkeanu