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.


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())

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.


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


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

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.


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 *

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.


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 *

Wydaje mi się to najbardziej eleganckie.
Massimiliano Kraus,

8

Do stosowania python3 albo z xxxx = nameo yourfile.

exec(open('./xxxx.py').read())

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())

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.