Làm thế nào để thực thi một tập tin trong trình thông dịch python?


289

Tôi đang cố gắng thực thi một tệp với các lệnh python từ bên trong trình thông dịch.

EDIT: Tôi đang cố gắng sử dụng các biến và cài đặt từ tệp đó, để không gọi một quy trình riêng biệt.


2
mô-đun os, và tôi đang kiểm tra các câu trả lời khác.
Adam Matan

2
Đề xuất os.system; Và đã xóa câu trả lời khi tôi đọc EDIT: - /
lightong

Câu trả lời:


229

Một số cách.

Từ vỏ

python someFile.py

Từ bên trong IDLE, nhấn F5 .

Nếu bạn đang gõ tương tác, hãy thử điều này: (chỉ Python 2 !)

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

Đối với Python3 , sử dụng:

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

10
pythonkhông hoạt động nếu bạn đang chạy python 3, python3được sử dụng thay thế.
pzkpfw

41
Execfile không còn tồn tại trong python3 và exec () dường như không hoạt động bằng cách nào đó ... không chắc chắn những gì tôi đang làm sai. bạn có thể cập nhật câu trả lời?
tạm

Có cách nào để cung cấp stdintừ một tệp như sử dụng <đến tập lệnh thực thi trong execfile().? @ s-lott
bhanu

9
@pzkpfw python có thể trỏ đến bất kỳ phiên bản nào của python. Tôi đã thấy các môi trường chỉ có python v3 nơi pythonchỉ đến python3.
StockB

2
@pzkpfw Điều đó phụ thuộc vào pythonhệ thống thực thi tìm thấy gì khi xem qua các thư mục trong biến môi trường PATH.
HelloGoodbye

254

Đối với Python 2:

>>> execfile('filename.py')

Đối với Python 3:

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

Xem tài liệu . Nếu bạn đang sử dụng Python 3.0, hãy xem câu hỏi này .

Xem câu trả lời của @ S.Lott để biết ví dụ về cách bạn truy cập toàn cầu từ filename.py sau khi thực hiện nó.


Phương pháp đọc làm gì? Thật không may, trang web tài liệu chính thức không cung cấp một ví dụ và giải thích rõ ràng.
Dmitry

Nó đọc tệp và trả về (theo mặc định) toàn bộ nội dung trong một chuỗi, xem ví dụ trang w3schools trên tệp đang mở .
Tối đa

Dưới đây là các tài liệu cho open (): docs.python.org/3/l Library / io.html
codeape

96

Python 2 + Python 3

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

Điều này sẽ thực thi một tập lệnh và đặt tất cả các biến toàn cục của nó trong phạm vi toàn cầu của trình thông dịch (hành vi bình thường trong hầu hết các môi trường tập lệnh).

execTài liệu Python 3


1
Bạn là người hùng của tôi! Tôi đã chiến đấu với một số thứ thực sự kỳ lạ trong nhiều ngày mà os.getcwd () đã nói một điều, nhưng global ("*") đã làm việc trong một thư mục khác ... Cảm ơn bạn! Cảm ơn bạn!
pallevillesen

Có cách nào để truyền tham số cho tập lệnh không? những thứ sau không hoạt động: exec (mở "setup.py install"). read (), globalals ())
ben

1
@ben sẽ không hoạt động vì openđọc trực tiếp mã từ tập lệnh. Để vượt qua các đối số, hãy xem câu trả lời này , nhưng thay vì execfile, rõ ràng sử dụng execopennhư được hiển thị ở trên.
Nico

47

Ngạc nhiên là tôi chưa thấy điều này. Bạn có thể thực thi một tệp và sau đó để trình thông dịch mở sau khi kết thúc thực thi bằng -itùy chọn:

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

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18

30

Tôi đang cố gắng sử dụng các biến và cài đặt từ tệp đó, để không gọi một quy trình riêng biệt.

Chà, chỉ cần nhập tệp với import filename(trừ .py, cần nằm trong cùng thư mục hoặc trên thư mục của bạn PYTHONPATH) sẽ chạy tệp, làm cho các biến, hàm, lớp, v.v. của nó có sẵn trong filename.variablekhông gian tên.

Vì vậy, nếu bạn có cheddar.pythư rác biến đổi và trứng chức năng - bạn có thể nhập chúng với import cheddar, truy cập vào biến cheddar.spamvà chạy hàm bằng cách gọicheddar.eggs()

Nếu bạn có mã cheddar.pynằm ngoài hàm, nó sẽ được chạy ngay lập tức, nhưng việc xây dựng các ứng dụng chạy nội dung khi nhập sẽ khiến bạn khó sử dụng lại mã của mình. Nếu tất cả có thể, đặt mọi thứ bên trong các hàm hoặc các lớp.


4
Điều đó sẽ không sử dụng không gian tên toàn cầu, như câu hỏi yêu cầu. Sử dụng thay thếfrom filename import *
Ricardo Cruz

Câu hỏi không đề cập cụ thể bằng cách sử dụng một không gian tên toàn cầu, đó có thể là những gì OP muốn, nhưng nó không rõ ràng từ câu hỏi.
ryanpcmcquen

13

Theo quan điểm của tôi, cách tốt nhất là:

import yourfile

và sau khi sửa đổi yourfile.py

reload(yourfile)   

hoặc là

import imp; 
imp.reload(yourfile) in python3

nhưng điều này sẽ làm cho hàm và các lớp trông giống như vậy: yourfile.feft1, yourfile. class1 .....

Nếu bạn không thể chấp nhận những điều đó, giải pháp cuối cùng là:

reload(yourfile)
from yourfile import *

9

Tôi không phải là một chuyên gia nhưng đây là những gì tôi nhận thấy:

nếu mã của bạn là mycode.py chẳng hạn và bạn chỉ nhập 'nhập mycode', Python sẽ thực thi nó nhưng nó sẽ không cung cấp tất cả các biến của bạn cho trình thông dịch. Tôi thấy rằng bạn nên nhập thực sự 'từ nhập mã mycode *' nếu bạn muốn cung cấp tất cả các biến cho trình thông dịch.


3
Thêm vào đó, nó nên là một bình luận, không phải là một câu trả lời.
Adam Matan

9

Cứ làm đi,

from my_file import *

Đảm bảo không thêm phần mở rộng .py. Nếu tệp .py của bạn trong thư mục con sử dụng,

from my_dir.my_file import *

Nó có vẻ thanh lịch nhất đối với tôi.
Massimiliano Kraus

8

Để sử dụng python3 hoặc với xxxx = namecác yourfile.

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

8

Đối với Python 3:

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

Đảm bảo rằng bạn đang ở đúng thư mục trước khi chạy lệnh.

Để chạy một tệp từ một thư mục khác, bạn có thể sử dụng lệnh dưới đây:

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

1

Giả sử bạn mong muốn các tính năng sau:

  1. Tệp nguồn hoạt động đúng trong trình gỡ lỗi của bạn (tên tệp hiển thị trong ngăn xếp, v.v.)
  2. __name__ == '__main__' là True để tập lệnh hoạt động đúng như tập lệnh.

Các exec(open('foo.py').read())thất bại Tính năng 1 Các import foochiến lược thất bại Tính năng 2

Để có được cả hai, bạn cần điều này:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.