J'ai un programme Python que je construis qui peut être exécuté de deux manières: la première est d'appeler "python main.py" qui invite l'utilisateur à entrer de manière conviviale, puis exécute l'entrée de l'utilisateur via le programme. L'autre façon est d'appeler "python batch.py -file- " qui passera sur toute la collecte des entrées conviviales et exécutera la valeur d'un fichier entier à travers le programme en une seule fois.
Le problème est que lorsque j'exécute "batch.py", il importe des variables / méthodes / etc depuis "main.py", et lorsqu'il exécute ce code:
import main
à la première ligne du programme, il se trompe immédiatement car il essaie d'exécuter le code dans "main.py".
Comment puis-je empêcher Python d'exécuter le code contenu dans le module "principal" que j'importe?
la source
En raison du fonctionnement de Python, il est nécessaire qu'il exécute vos modules lorsqu'il les importe.
Pour empêcher le code du module d'être exécuté lors de l'importation, mais uniquement lorsqu'il est exécuté directement, vous pouvez le protéger avec ceci
if
:Vous souhaiterez peut-être placer ce code dans une
main()
méthode, afin de pouvoir exécuter le fichier directement ou importer le module et appeler lemain()
. Par exemple, supposons que ce soit dans le fichierfoo.py
.Ce programme peut être exécuté soit en allant
python foo.py
, soit à partir d'un autre script Python:la source
Utilisez l'
if __name__ == '__main__'
idiome -__name__
est une variable spéciale dont la valeur est'__main__'
si le module est exécuté en tant que script, et le nom du module s'il est importé. Alors tu ferais quelque chose commela source
Malheureusement, vous ne le faites pas. Cela fait partie du fonctionnement de la syntaxe d'importation et il est important que ce soit le cas - rappelez-vous que
def
c'est en fait quelque chose qui est exécuté, si Python n'exécutait pas l'importation, vous seriez, eh bien, bloqué sans fonctions.Étant donné que vous avez probablement accès au fichier, vous pourrez peut-être rechercher et voir ce qui cause l'erreur. Il peut être possible de modifier votre environnement pour empêcher l'erreur de se produire.
la source
Mettez le code dans une fonction et il ne fonctionnera pas tant que vous n'aurez pas appelé la fonction. Vous devriez avoir une fonction principale dans votre
main.py
. avec la déclaration:Ensuite, si vous appelez,
python main.py
lamain()
fonction s'exécutera. Si vous importezmain.py
, ce ne sera pas le cas. De plus, vous devriez probablement renommermain.py
quelque chose d'autre pour des raisons de clarté.la source
Il y avait une proposition d'amélioration de Python PEP 299 qui visait à remplacer l'
if __name__ == '__main__':
idiome pardef __main__:
, mais elle a été rejetée. C'est toujours une bonne lecture pour savoir ce qu'il faut garder à l'esprit lors de l'utilisationif __name__ = '__main__':
.la source
Vous pouvez écrire votre "main.py" comme ceci:
la source
Bien que vous ne puissiez pas utiliser
import
sans exécuter le code; il existe une manière assez rapide de saisir vos variables; en utilisantnumpy.savez
, qui stocke les variables sous forme de tableaux numpy dans un fichier .npz. Ensuite, vous pouvez charger les variables en utilisantnumpy.load
.Voir une description complète dans la documentation scipy
Veuillez noter que ce n'est le cas que pour les variables et les tableaux de variables, et non pour les méthodes, etc.
la source
Essayez simplement d'importer les fonctions nécessaires à partir de main.py? Alors,
Il se peut que vous ayez nommé une fonction dans batch.py de la même manière que dans main.py, et lorsque vous importez main.py, le programme exécute la fonction main.py au lieu de la fonction batch.py; faire ce qui précède devrait résoudre ce problème. J'espère.
la source
import main
N'importe PAS tout de main dans l'espace de noms actuel. Il n'ajoute qu'un seulmain
symbole dans l'espace de noms actuel, donc les collisions ne peuvent pas se produire.