Avez-vous déjà essayé d'exécuter un fichier Python avec une importation relative sur PyCharm et cela n'a pas fonctionné?
TL;DR
$ModuleSdkPath$
-c "import os,runpy;runpy.run_module('.'.join(r'$FilePathRelativeToSourcepath$'.replace(os.sep,'.').split('.')[:-1]),{},__name__,1)"
$Sourcepath$
Définissez correctement la racine des sources et ajoutez des outils externes avec les paramètres ci-dessus.
Par exemple, créez le fichier suivant dans votre propre package appelé my_pkg
.
my_pkg/foo.py
x = 42
my_pkg/bar.py
from .foo import x
if __name__ == '__main__':
print(x)
Si j'ouvre my_pkg / bar.py avec PyCharm et que je l'exécute simplement, j'obtiens l'exception suivante.
/usr/bin/python3 /tmp/my_pkg/bar.py
Traceback (most recent call last):
File "/tmp/my_pkg/bar.py", line 1, in <module>
from .foo import x
ModuleNotFoundError: No module named '__main__.foo'; '__main__' is not a package
Process finished with exit code 1
La raison est expliquée en détail dans l'article ici.
En conclusion, cela fonctionne bien si vous l'exécutez avec l'option -m
et le nom complet du module ( my_pkg.bar
).
# ERROR!!
/usr/bin/python3 /tmp/my_pkg/bar.py
# OK
cd /tmp
/usr/bin/python3 -m my_pkg.bar
En d'autres termes, vous pouvez d'une manière ou d'une autre faire fonctionner PyCharm au format d'option -m
.
Vous pouvez l'exécuter dans le format d'option -m
en le définissant comme indiqué dans l'image ci-dessous.
Cependant, cette méthode pose le problème très sérieux de ** devoir définir ceci chaque fois que vous voulez exécuter **.
PyCharm a une fonction pour gérer les fichiers exécutables externes, alors profitez-en. C'est un peu ennuyeux, mais l'avantage est que vous ne devez le définir qu'une seule fois et qu'il peut être utilisé dans tous les projets.
Allez dans Fichier → Paramètres → Outils → Outils externes dans la barre de menus pour ajouter de nouveaux outils externes.
Veuillez définir la partie Paramètres de l'outil comme suit.
$ModuleSdkPath$
-c "import os,runpy;runpy.run_module('.'.join(r'$FilePathRelativeToSourcepath$'.replace(os.sep,'.').split('.')[:-1]),{},__name__,1)"
$Sourcepath$
Tout ce que vous avez à faire est de faire un clic droit sur le répertoire parent de my_pkg
et de l'enregistrer en tant que racine des sources.
Avec bar.py
ouvert, cliquez sur Outil-> Outils externes-> python -m dans la barre de menus.
Si vous pouvez le faire correctement, vous réussissez. Si vous l'utilisez fréquemment, il est pratique d'attribuer une touche de raccourci.
Recommended Posts