Lorsqu'un script python est supposé être exécuté à partir d'une pyenv
virtualenv
, 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.
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.
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 .
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? )
vous devez peut-être vérifier les privilèges de fichier:
Sudo chmod +x script.py