Note: ce billet concernent ceux qui utilisent plusieurs interpréteurs python différents et s’amusent à appeler les uns via les autres, voir un futur billet sur les services, webservices ou multi tasking.

En utilisant REZ et deadline, je suis tombé sur un problème épineux, tous mes jobs lançant une ligne de commande de type `rez env monPackages — python -m monScript` échouaient avec des erreurs imbitables.

Traceback (most recent call last):
   File "dblocal wrapper.py", line 4, in 
     import sqlite3
   File "c:\packages\sofwares\python\3.7\platform-windows\arch-AMD64\os-windows-10\Lib\sqlite3__init__.py", line 23, in 
     from sqlite3.dbapi2 import *
   File "c:\packages\sofwares\python\3.7\platform-windows\arch-AMD64\os-windows-10\Lib\sqlite3\dbapi2.py", line 27, in 
     from _sqlite3 import *
 ModuleNotFoundError: No module named '_sqlite3'

Bien entendu, cette erreur ne veut rien dire pour plusieurs raisons:

  • tout marche bien en temps normal
  • sqlite3 est un module livré avec python (2 et 3)
  • si je passe l’import de sqlite3, j’ai la même erreur sur d’autres modules compilés
  • j’ai des erreurs de syntaxe python 3

Les deux derniers points mettent donc la puce à l’oreille sur un problème cross interpréteur (ici, environnement python3 lancé via un python2).

Méthode:

  • print(sys.interpreter) pour vérifier que l’interpréteur est le bon, si c’est le cas, votre erreur n’est pas décrite dans ce billet. Et effectivement il va pointer vers `d:/mon_ptn_workspace/python.exe` au lieu de `d:/je_te_veux_ici/python.exe`
  • `print(os.getcwd()) et vérifier qu’il n’y a pas d’interpréteur dans ce dossier, et effectivement, dans mon cas, il pointait sur `d:/mon_ptn_workspace/` et donc, REZ allait chercher d’abord dans le workspace.

Le problème à donc été résolu en modifiant, au lancement du job (dans le plugin deadline), le directoire de travail courant.