web-dev-qa-db-fra.com

Comment dire à un script Python d'utiliser une version particulière

Comment, dans le module main.py (probablement), dis-je Python quel interprète utiliser? Ce que je veux dire, c’est: si je veux qu’un script particulier utilise la version 3 de Python pour interpréter l’ensemble du programme, comment puis-je le faire?

Bonus: Comment cela affecterait une virtualenv? Ai-je raison de penser que si je crée une virtualenv pour mon programme et que je lui dis ensuite d'utiliser une version différente de Python, je risque alors de rencontrer des conflits?

63
jesuis

Vous pouvez tracer la ligne supérieure du script en ligne, mais cela ne fonctionnera que si vous exécutez le fichier ./my_program.py.

Si vous exécutez en tant que python my_program.py, puis la version quelconque Python que which python les retours seront utilisés.

Dans re: to virtualenv utiliser: virtualenv -p /usr/bin/python3.2 ou quoi que ce soit pour l’utiliser Python exécutable.

40
Jon Clements

Peut-être pas exactement ce que vous avez demandé, mais je trouve cela utile de mettre au début de mes programmes:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
39
Gravity Grave

Je voudrais utiliser le Shebang #!/usr/bin/python (première ligne de code) avec le numéro de série de Python à la fin;)

Il en va de même lorsque vous souhaitez exécuter Python à partir d'une ligne de commande Linux.

16
Andrew

Bien que l'OP travaille peut-être sur une plate-forme * nix, cette réponse pourrait aider les plates-formes non * nix. Je n'ai pas expérimenté l'approche Shebang dans Microsoft Windows.

Reformulé: la ligne Shebang répond à votre question de "dans mon script" mais je crois uniquement pour les plates-formes Unix. Même si c’est le shell Unix, en dehors du script, qui interprète la ligne Shebang pour déterminer quelle version de l’interpréteur Python à appeler. Je ne suis pas sûr, mais cette solution ne résout pas le problème le problème pour les utilisateurs de la plate-forme Microsoft Windows.

Dans le monde Microsoft Windows, simplifier la manière d’exécuter une version spécifique de Python), sans configuration des variables d’environnement spécifiquement pour chaque version spécifique de Python installé, en préfixant python.exe avec le chemin à partir duquel vous voulez l’exécuter, tel que C:\Python25\python.exe monmodule.py ou D:\Python27\python.exe mymodule.py

Cependant, vous devez prendre en compte les variables d’environnement PYTHONPATH et PYTHON ... qui indiqueraient la mauvaise version des bibliothèques Python.

Par exemple, vous pouvez exécuter: C:\Python2.5.2\python.exe mymodule

Cependant, les variables d'environnement peuvent pointer vers la mauvaise version en tant que telle:

PYTHONPATH = D:\Python27

PYTHONLIB = D:\Python27\lib

Des tas de fun horrible!

Donc, une manière non virtuelle, sous Windows, serait d'utiliser un fichier de commandes qui configure l'environnement et appelle un exécutable spécifique Python exécutable via le préfixe python.exe avec le chemin dans lequel il réside. De cette façon, vous aurez à gérer des détails supplémentaires, tels que l’utilisation d’arguments en ligne de commande pour l’une des commandes "start" ou "cmd.exe" pour "sauvegarder et remplacer l’environnement" console ". "si vous voulez que la console reste en place après la fermeture de l’application.

Votre question me porte à croire que vous avez plusieurs Python modules, chacun attend une certaine version de Python. Cela pourrait être résolu "dans" le script en ayant un module de lancement qui utilise le sous-processus Au lieu d'appeler mymodule.py, vous appelez un module qui appelle votre module; peut-être launch_mymodule.py

launch_mymodule.py

import subprocess
if sys.argv[2] == '272':
  env272 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)

if sys.argv[1] == '252'
  env252 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)

Je n'ai pas testé cela.

12
DevPlayer

Vous ne pouvez pas faire cela dans le programme Python, car le shell décide quelle version utiliser si vous utilisez une ligne Shebang.

Si vous n'utilisez pas de shell avec une ligne Shebang et tapez simplement python myprogram.py il utilise la version par défaut, à moins que vous ne décidiez spécifiquement quelle version Python lorsque vous tapez pythonXXX myprogram.py quelle version utiliser.

Une fois que votre programme Python est en cours d'exécution, vous avez déjà décidé quel Python à utiliser pour le faire fonctionner.

virtualenv est utilisé pour séparer les versions et les environnements python), il existe spécifiquement pour éliminer les conflits.

1
user177800

Tout en travaillant avec différentes versions de Python sous Windows,

J'utilise cette méthode pour basculer entre les versions.

Je pense que c'est mieux que de jouer avec shebangs et virtualenvs

1) installer python que vous désirez

2) Allez à Variables d'environnement> CHEMIN

(Je suppose que les chemins de python sont déjà ajoutées à Env.Vars.> CHEMIN D'ACCÈS)

3) supprimer les chemins de tous les python que vous ne voulez pas utiliser

(ne supprimez pas les chemins, ajoutez simplement un suffixe du type "_sup")

4) appelez python depuis le terminal

(Windows va donc ignorer les mauvais chemins que vous avez modifiés, et trouvera le fichier python.exe sur le chemin que vous n'avez pas supprimé, et utilisera cette version après)

5) basculer entre les versions en jouant avec des suffixes

0
GMG