Bagaimana cara mengeksekusi file dalam interpreter python?

289

Saya mencoba mengeksekusi file dengan perintah python dari dalam interpreter.

EDIT: Saya mencoba menggunakan variabel dan pengaturan dari file itu, bukan untuk meminta proses yang terpisah.

Adam Matan
sumber
2
modul os, dan saya sedang memeriksa jawaban lain.
Adam Matan
2
Sistem yang disarankan; Dan jawaban yang dihapus ketika saya membaca EDIT: - /
lightsong

Jawaban:

229

Beberapa cara.

Dari cangkang

python someFile.py

Dari dalam IDLE, tekan F5 .

Jika Anda mengetik secara interaktif, coba ini: ( hanya Python 2 !)

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

Untuk Python3 , gunakan:

>>> exec(open("filename.py").read())
S.Lott
sumber
10
pythontidak berfungsi jika Anda menjalankan python 3, python3digunakan sebagai gantinya.
pzkpfw
41
Execfile tidak lagi ada di python3, dan exec () tampaknya tidak berfungsi entah bagaimana ... tidak yakin apa yang saya lakukan salah. dapatkah Anda memperbarui jawabannya?
temporary_user_name
apakah ada cara untuk menyediakan stdindari file seperti menggunakan <ke skrip pelaksana di execfile().? @ s-lott
bhanu
9
@pzkpfw python dapat menunjuk ke versi python apa pun. Saya telah melihat lingkungan dengan hanya python v3 di mana pythonmenunjuk ke python3.
StockB
2
@ pzkpfw Itu tergantung pada apa yang pythondapat dieksekusi yang ditemukan sistem ketika melihat melalui folder dalam variabel lingkungan PATH.
HelloGoodbye
254

Untuk Python 2:

>>> execfile('filename.py')

Untuk Python 3:

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

Lihat dokumentasi . Jika Anda menggunakan Python 3.0, lihat pertanyaan ini .

Lihat jawaban oleh @ S.Lott untuk contoh bagaimana Anda mengakses global dari filename.py setelah menjalankannya.

kode kode
sumber
Apa yang dilakukan metode baca? Sayangnya situs dokumentasi resmi tidak memberikan contoh dan penjelasan yang jelas.
Dmitry
Itu membaca file dan mengembalikan (secara default) seluruh konten dalam satu string tunggal, lihat misalnya halaman w3schools pada file yang terbuka .
Maks
Berikut adalah dokumentasi untuk terbuka (): docs.python.org/3/library/io.html
codeape
96

Python 2 + Python 3

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

Ini akan menjalankan skrip dan meletakkan semua variabel globalnya dalam lingkup global juru bahasa (perilaku normal di sebagian besar lingkungan skrip).

execDokumentasi Python 3

Waylon Flinn
sumber
1
Kamu adalah pahlawanku! Saya telah berkelahi dengan beberapa hal yang sangat aneh selama berhari-hari ketika os.getcwd () mengatakan satu hal, tetapi glob ("*") bekerja di direktori lain ... Terima kasih! Terima kasih!
pallevillesen
Apakah ada cara untuk mengirimkan parameter ke skrip? berikut ini tidak berfungsi: exec (buka "setup.py install"). read (), global ())
ben
1
@ Ben yang tidak akan berfungsi karena openlangsung membaca kode dari skrip. Untuk memberikan argumen, lihat jawaban ini , tetapi alih-alih execfile, jelas gunakan execdan openseperti yang ditunjukkan di atas.
Nico
47

Terkejut saya belum melihat ini. Anda dapat mengeksekusi file dan kemudian membiarkan penerjemah terbuka setelah eksekusi berakhir menggunakan -iopsi:

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

def bar(bing):
  return bing*3

--------



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

Saya mencoba menggunakan variabel dan pengaturan dari file itu, bukan untuk meminta proses yang terpisah.

Yah, cukup mengimpor file dengan import filename(minus .py, perlu berada di direktori yang sama atau di Anda PYTHONPATH) akan menjalankan file, membuat variabel, fungsi, kelas, dll tersedia di filename.variablenamespace.

Jadi jika Anda memiliki cheddar.pyvariabel spam dan telur fungsi - Anda dapat mengimpornya import cheddar, mengakses variabel dengan cheddar.spamdan menjalankan fungsinya dengan memanggilcheddar.eggs()

Jika Anda memiliki kode di cheddar.pyluar fungsi, kode itu akan segera dijalankan, tetapi membangun aplikasi yang menjalankan barang impor akan membuatnya sulit untuk menggunakan kembali kode Anda. Jika memungkinkan, letakkan semuanya di dalam fungsi atau kelas.

mikl
sumber
4
Itu tidak akan menggunakan namespace global, seperti yang diminta pertanyaan. Gunakan sebagai gantinyafrom filename import *
Ricardo Cruz
Pertanyaannya tidak secara khusus menyebutkan menggunakan namespace global, itu mungkin yang diinginkan OP, tetapi tidak jelas dari pertanyaan itu.
ryanpcmcquen
13

Dari pandangan saya, cara terbaik adalah:

import yourfile

dan setelah memodifikasi file Anda.py

reload(yourfile)   

atau

import imp; 
imp.reload(yourfile) in python3

tetapi ini akan membuat fungsi dan kelas terlihat seperti itu: yourfile.function1, yourfile.class1 .....

Jika Anda tidak dapat menerimanya, solusi akhirnya adalah:

reload(yourfile)
from yourfile import *
Neo li
sumber
9

Saya bukan ahli tapi ini yang saya perhatikan:

jika kode Anda adalah mycode.py misalnya, dan Anda mengetik 'import mycode' saja, Python akan menjalankannya tetapi itu tidak akan membuat semua variabel Anda tersedia untuk penerjemah. Saya menemukan bahwa Anda harus mengetik sebenarnya 'dari impor kode saya *' jika Anda ingin membuat semua variabel tersedia untuk penerjemah.

carlos e orozco
sumber
3
Plus, itu harus berupa komentar, bukan jawaban.
Adam Matan
9

Kerjakan saja,

from my_file import *

Pastikan untuk tidak menambahkan ekstensi .py. Jika file .py Anda digunakan dalam subdirektori,

from my_dir.my_file import *
Shital Shah
sumber
Sepertinya yang paling elegan bagiku.
Massimiliano Kraus
8

Untuk penggunaan python3 baik dengan xxxx = namedari yourfile.

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

Untuk Python 3:

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

Pastikan Anda berada di direktori yang benar sebelum menjalankan perintah.

Untuk menjalankan file dari direktori lain, Anda dapat menggunakan perintah di bawah ini:

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

Andaikata Anda menginginkan fitur-fitur berikut:

  1. File sumber berperilaku baik di debugger Anda (nama file ditampilkan di tumpukan, dll)
  2. __name__ == '__main__' Benar sehingga skrip berperilaku dengan benar sebagai skrip.

Fitur exec(open('foo.py').read())gagal 1 import fooStrategi gagal fitur 2

Untuk mendapatkan keduanya, Anda memerlukan ini:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
pengguna3667349
sumber