Comment exécuter un fichier dans l'interpréteur python?

289

J'essaie d'exécuter un fichier avec des commandes python à partir de l'interpréteur.

EDIT: J'essaie d'utiliser des variables et des paramètres de ce fichier, pas d'invoquer un processus distinct.

Adam Matan
la source
2
module os, et je vérifie les autres réponses.
Adam Matan
2
Système os suggéré; Et supprimé la réponse quand j'ai lu l'EDIT: - /
lightsong

Réponses:

229

Plusieurs façons.

De la coquille

python someFile.py

De l'intérieur IDLE, appuyez sur F5 .

Si vous tapez de manière interactive, essayez ceci: ( Python 2 uniquement !)

>>> variables= {}
>>> execfile( "someFile.py", variables )
>>> print variables # globals from the someFile module

Pour Python3 , utilisez:

>>> exec(open("filename.py").read())
S.Lott
la source
10
pythonne fonctionne pas si vous exécutez python 3, python3est utilisé à la place.
pzkpfw
41
Execfile n'existe plus en python3, et exec () ne semble pas fonctionner d'une manière ou d'une autre ... je ne sais pas ce que je fais mal. pourriez-vous mettre à jour la réponse?
temporaire_user_name
existe-t-il un moyen de fournir à stdinpartir d'un fichier comme l'utilisation <du script d'exécution dans le execfile().? @ s-lott
bhanu
9
@pzkpfw python peut pointer vers n'importe quelle version de python. J'ai vu des environnements avec seulement python v3 vers lesquels pythonpointe python3.
StockB
2
@pzkpfw Cela dépend de l' pythonexécutable que le système trouve en parcourant les dossiers de la variable d'environnement PATH.
HelloGoodbye
254

Pour Python 2:

>>> execfile('filename.py')

Pour Python 3:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

Consultez la documentation . Si vous utilisez Python 3.0, consultez cette question .

Voir la réponse de @ S.Lott pour un exemple de la façon dont vous accédez aux globaux à partir de filename.py après l'avoir exécuté.

codeape
la source
Que fait la méthode de lecture? Malheureusement, le site de documentation officiel ne fournit pas d'exemple et d'explication clairs.
Dmitry
Il lit le fichier et renvoie (par défaut) le contenu entier dans une seule chaîne, voir par exemple la page w3schools sur le fichier ouvert .
Max
Voici les documents pour open (): docs.python.org/3/library/io.html
codeape
96

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

Cela exécutera un script et mettra toutes ses variables globales dans la portée globale de l'interpréteur (le comportement normal dans la plupart des environnements de script).

execDocumentation Python 3

Waylon Flinn
la source
1
Tu es mon héros! Je me bats avec des trucs vraiment bizarres depuis des jours où os.getcwd () a dit une chose, mais glob ("*") a travaillé dans un autre répertoire ... Merci! Je vous remercie!
pallevillesen
Existe-t-il un moyen de passer un paramètre au script? ce qui suit ne fonctionne pas: exec (ouvrez "setup.py install"). read (), globals ())
ben
1
@ben qui ne fonctionnera pas car openlit directement le code du script. Pour passer des arguments, regardez cette réponse , mais au lieu de execfile, utilisez évidemment execet opencomme indiqué ci-dessus.
Nico
47

Surpris, je ne l'ai pas encore vu. Vous pouvez exécuter un fichier, puis laisser l'interpréteur ouvert une fois l'exécution terminée à l'aide de l' -ioption:

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18
Bennett Talpers
la source
30

J'essaie d'utiliser des variables et des paramètres de ce fichier, de ne pas invoquer un processus distinct.

Eh bien, simplement importer le fichier avec import filename(moins .py, doit être dans le même répertoire ou sur votre PYTHONPATH) exécutera le fichier, rendant ses variables, fonctions, classes, etc. disponibles dans lefilename.variable espace de noms.

Donc, si vous avez cheddar.pyavec la variable spam et les oeufs de fonction - vous pouvez les importer avec import cheddar, accéder à la variable avec cheddar.spamet exécuter la fonction en appelantcheddar.eggs()

Si vous avez du code en cheddar.pydehors d'une fonction, il sera exécuté immédiatement, mais la création d'applications qui exécutent des éléments lors de l'importation rendra difficile la réutilisation de votre code. Si possible, mettez tout à l'intérieur des fonctions ou des classes.

mikl
la source
4
Cela n'utilisera pas l'espace de noms global, comme l'exige la question. Utilisez à la placefrom filename import *
Ricardo Cruz
La question ne mentionne pas spécifiquement l'utilisation d'un espace de noms global, c'est peut-être ce que souhaite l'OP, mais cela ne ressort pas clairement de la question.
ryanpcmcquen
13

De mon point de vue, la meilleure façon est:

import yourfile

et après avoir modifié yourfile.py

reload(yourfile)   

ou

import imp; 
imp.reload(yourfile) in python3

mais cela rendra la fonction et les classes comme ça: yourfile.function1, yourfile.class1 .....

Si vous ne pouvez pas les accepter, la solution finale est:

reload(yourfile)
from yourfile import *
Neo li
la source
9

Je ne suis pas un expert mais c'est ce que j'ai remarqué:

si votre code est mycode.py par exemple, et que vous tapez simplement 'import mycode', Python l'exécutera mais ne mettra pas toutes vos variables à la disposition de l'interpréteur. J'ai trouvé que vous devez taper réellement 'from mycode import *' si vous voulez mettre toutes les variables à la disposition de l'interpréteur.

carlos e orozco
la source
3
De plus, ce devrait être un commentaire, pas une réponse.
Adam Matan
9

Faites,

from my_file import *

Assurez-vous de ne pas ajouter l'extension .py. Si votre fichier .py dans le sous-répertoire utilise,

from my_dir.my_file import *
Shital Shah
la source
Il me semble le plus élégant.
Massimiliano Kraus
8

Pour python3, utilisez soit avec xxxx = nameof yourfile.

exec(open('./xxxx.py').read())
AMG
la source
8

Pour Python 3:

>>> exec(open("helloworld.py").read())

Assurez-vous que vous êtes dans le bon répertoire avant d'exécuter la commande.

Pour exécuter un fichier à partir d'un répertoire différent, vous pouvez utiliser la commande ci-dessous:

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())
Prashant Gonga
la source
1

Supposons que vous souhaitiez les fonctionnalités suivantes:

  1. Le fichier source se comporte correctement dans votre débogueur (le nom du fichier s'affiche dans la pile, etc.)
  2. __name__ == '__main__' a la valeur True pour que les scripts se comportent correctement comme des scripts.

La exec(open('foo.py').read())fonction échoue 1 La import foostratégie échoue fonction 2

Pour obtenir les deux, vous avez besoin de ceci:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
user3667349
la source