Jak wykonać plik w interpreterie Pythona?

289

Próbuję wykonać plik za pomocą poleceń Pythona z poziomu interpretera.

EDYCJA: Próbuję użyć zmiennych i ustawień z tego pliku, aby nie wywoływać osobnego procesu.

Adam Matan
źródło
2
moduł os i sprawdzam inne odpowiedzi.
Adam Matan
2
Sugerowany os.system; I
usunąłem

Odpowiedzi:

229

Kilka sposobów.

Z muszli

python someFile.py

Z wnętrza JUŻ, naciśnij F5 .

Jeśli piszesz interaktywnie, spróbuj tego: ( tylko Python 2 !)

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

W przypadku Python3 użyj:

>>> exec(open("filename.py").read())
S.Lott
źródło
10
pythonnie działa, jeśli używasz Pythona 3, python3zamiast niego jest używany.
pzkpfw
41
Plik wykonywalny już nie istnieje w python3, a exec () nie działa jakoś ... nie jestem pewien, co robię źle. czy możesz zaktualizować odpowiedź?
tymczasowego
czy jest jakiś sposób na dostarczenie stdinz pliku takiego jak using <do skryptu wykonawczego z execfile(). @ s-lott
bhanu
9
@pzkpfw Python może wskazywać na dowolną wersję Pythona. Widziałem środowiska, w których tylko Python v3 pythonwskazuje na python3.
StockB
2
@pzkpfw To zależy od pythonpliku wykonywalnego, który system znajdzie podczas przeglądania folderów w zmiennej środowiskowej PATH.
HelloGoodbye,
254

W przypadku Python 2:

>>> execfile('filename.py')

W przypadku Python 3:

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

Zobacz dokumentację . Jeśli używasz języka Python 3.0, zobacz to pytanie .

Zobacz odpowiedź @ S.Lott, aby zobaczyć, w jaki sposób uzyskujesz dostęp do globals z pliku filename.py po jego wykonaniu.

Codeape
źródło
Co robi metoda odczytu? Niestety oficjalna strona z dokumentacją nie zawiera wyraźnego przykładu i wyjaśnienia.
Dmitry
Odczytuje plik i zwraca (domyślnie) całą zawartość w jednym ciągu, patrz np. Otwarta strona pliku w3schools .
Maks
Oto dokumenty do open (): docs.python.org/3/library/io.html
codeape
96

Python 2 + Python 3

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

Spowoduje to wykonanie skryptu i umieszczenie wszystkich jego zmiennych globalnych w globalnym zakresie interpretera (normalne zachowanie w większości środowisk skryptowych).

execDokumentacja Python 3

Waylon Flinn
źródło
1
Jesteś moim bohaterem! Walczyłem z naprawdę dziwnymi rzeczami od wielu dni, w których os.getcwd () powiedział jedno, ale glob („*”) pracował w innym katalogu ... Dziękuję Ci!
pallevillesen
Czy istnieje sposób na przekazanie parametru do skryptu? następujące polecenie nie działa: exec (otwórz „setup.py install”). read (), globals ())
ben
1
@ben to nie zadziała, ponieważ openbezpośrednio odczytuje kod ze skryptu. Aby przekazać argumenty, spójrz na tę odpowiedź , ale zamiast tego execfileoczywiście użyj execi openjak pokazano powyżej.
Nico,
47

Zaskoczony, jeszcze tego nie widziałem. Możesz wykonać plik, a następnie pozostaw interpretera otwartego po zakończeniu wykonywania, używając -iopcji:

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

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18
Bennett Talpers
źródło
30

Próbuję użyć zmiennych i ustawień z tego pliku, aby nie wywoływać osobnego procesu.

Po prostu zaimportowanie pliku za pomocą import filename(minus .py, musi znajdować się w tym samym katalogu lub w twoim PYTHONPATH) spowoduje uruchomienie pliku, dzięki czemu jego zmienne, funkcje, klasy itp. Będą dostępne w filename.variableprzestrzeni nazw.

Jeśli masz cheddar.pyzmienną spam i jaja funkcyjne - możesz je zaimportować import cheddar, uzyskać dostęp do zmiennej cheddar.spami uruchomić funkcję, wywołująccheddar.eggs()

Jeśli masz kod, cheddar.pyktóry znajduje się poza funkcją, zostanie on uruchomiony natychmiast, ale tworzenie aplikacji, które wykonują operacje podczas importu, utrudni ponowne użycie kodu. Jeśli to możliwe, umieść wszystko w funkcjach lub klasach.

mikl
źródło
4
To nie będzie używać globalnej przestrzeni nazw, jak wymaga tego pytanie. Zamiast tego użyjfrom filename import *
Ricardo Cruz,
Pytanie nie wspomina konkretnie o użyciu globalnej przestrzeni nazw, być może tego chce OP, ale nie jest to oczywiste z pytania.
ryanpcmcquen
13

Moim zdaniem najlepszym sposobem jest:

import yourfile

i po zmodyfikowaniu pliku.file.py

reload(yourfile)   

lub

import imp; 
imp.reload(yourfile) in python3

ale to sprawi, że funkcja i klasy będą wyglądały następująco: twój_plik.funkcja1, twój_plik.klasa1 .....

Jeśli nie możesz ich zaakceptować, ostatecznym rozwiązaniem jest:

reload(yourfile)
from yourfile import *
Neo li
źródło
9

Nie jestem ekspertem, ale zauważyłem:

jeśli na przykład masz kod mycode.py i wpiszesz po prostu „import mycode”, Python wykona go, ale nie udostępni wszystkich interpreterów. Odkryłem, że powinieneś wpisać „z importu mycode *”, jeśli chcesz udostępnić interpreterowi wszystkie zmienne.

Carlos e Orozco
źródło
3
Ponadto powinien to być komentarz, a nie odpowiedź.
Adam Matan,
9

Po prostu zrób,

from my_file import *

Pamiętaj, aby nie dodawać rozszerzenia .py. Jeśli używasz pliku .py w podkatalogu,

from my_dir.my_file import *
Shital Shah
źródło
Wydaje mi się to najbardziej eleganckie.
Massimiliano Kraus,
8

Do stosowania python3 albo z xxxx = nameo yourfile.

exec(open('./xxxx.py').read())
AMG
źródło
8

W przypadku Python 3:

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

Upewnij się, że jesteś w odpowiednim katalogu przed uruchomieniem polecenia.

Aby uruchomić plik z innego katalogu, możesz użyć następującego polecenia:

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())
Prashant Gonga
źródło
1

Załóżmy, że potrzebujesz następujących funkcji:

  1. Plik źródłowy zachowuje się poprawnie w twoim debuggerze (nazwa pliku pokazuje się na stosie itp.)
  2. __name__ == '__main__' ma wartość True, więc skrypty zachowują się poprawnie jak skrypty.

exec(open('foo.py').read())Nie funkcji 1 W import foostrategii nie cecha 2

Aby uzyskać oba, potrzebujesz:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
użytkownik3667349
źródło