L'exécution d'un script python à partir de l'intérieur de virtualenv bin n'est pas de travail
J'ai un script que je veux être disponible dans le monde entier. J'ai commencé avec la norme hashbang:
#! /usr/bin/env python
Et l'a lié dans le répertoire bin de mon virtualenv:
~/environments/project/env/bin/myscript
Et a ajouté que le répertoire de mon chemin. Lorsque je lance la commande:
myscript
Je reçois un message d'erreur d'importation avec l'une des bibliothèques. Cependant, si j'active l'environnement virtuel et exécutez le script, il fonctionne comme prévu.
J'ai écarté un problème avec le lien (j'ai aussi essayé de simplement déplacer le script dans le dossier bin). J'ai aussi essayé de lancer le script avec python
python ~/environments/project/env/bin/myscript
Auparavant, j'utilisais un script qui a activé l'environnement, puis a couru mon script, mais j'étais sous l'impression que le script s'exécuter à partir de ce dossier doit s'exécuter avec le virtualenv de l'interprète et site-packages. Toutes les idées de pourquoi ce ne serait pas de travail ou certaines façons que je pouvais corriger de cette?
- Sans rapport avec votre question: même si la plupart des shells de l'ignorer, à l'aide de
#! /
est à proprement parler mal, que l'espace devait être considéré comme une partie du chemin du programme. Baisse de l'espace et de votre sécurité.
Vous devez vous connecter pour publier un commentaire.
De mettre le script dans le bac de votre virtualenv, puis en ajoutant que l'emplacement de votre CHEMIN d'accès global ne sera pas automatiquement la source de votre virtualenv. Vous avez besoin de la source première pour la rendre active.
Tout ce que votre système sait est de vérifier que les extra chemin d'accès de l'exécutable et le lancer. Il n'y a pas quelque chose dans le script indiquant un virtualenv.
Vous pouvez, cependant, coder en dur elle-bang ligne à votre virtualenv python, auquel cas le site-packages de finir sur le chemin:
Ou une autre option est de simplement créer un petit bash wrapper qui appelle votre original pythons script, ce qui vous permettra de laisser votre script d'origine avec un générique elle-bang..
Donc, si myscript.py est:
#!/usr/bin/env python
...Alors vous pouvez faire un
myscript
:Lorsque vous ne
myscript
, il est explicitement appelez votre script python avec l'interprète que vous avez configuré.Je pense que vous êtes confus quant à la façon dont virtualenv œuvres.
En un mot, virtualenv modifie votre environnement de shell, de sorte que Python va chercher dans différents domaines pour trouver les modules que vous souhaitez importer. Il n'y a vraiment aucun rapport entre l'endroit où vous stockez votre environnement virtuel et de l'endroit où vous stockez vos fichiers source que vous exécutez dans le virtualenv. Si vous voulez, vous pouvez stocker votre virtualenv dans le répertoire ~/environnements/my_env, et tous les source de code lors de l'utilisation de votre virtualenv dans ~/projets/my_proj.
Vous pouvez en lire plus à propos de ce virtulenv n' dans les docs.
Vraiment, la seule chose qui indique à python où trouver les modules sont complètement basé sur le langage python (voir les docs sur la façon dont il fonctionne). L'activation d'un virtualenv modifie la façon dont le python fonctionne.
Vous pouvez revenir en arrière pour avoir un shell script activer le virtualenv pour vous, ou vous pouvez suivre cette recette pour l'activer directement à partir de votre script.
Si vous choisissez cette voie, garder l'info les docs donner à l'esprit:
Ne pourriez-vous ajouter un chemin d'accès relatif à la place? Cela a fonctionné pour moi:
J'ai connu le même problème et est venu avec cette solution: https://github.com/jabbalaci/wpython. C'est un script qui s'appelle "
wpython
" qui appelle votre programme local de l'interpréteur Python dans votre venv. Ainsi, au lieu de "/Users/foo/environments/project/env/bin/python myscript.py
" il suffit d'écrire "wpython /path/to/myscript.py
". Un script de lancement, pourrait ressembler à ceci:Dans le cas où vous utilisez windows, vous pouvez inclure la ligne suivante dans le haut du fichier python.