Điều gì sẽ xảy ra nếu tôi sửa đổi tập lệnh Python trong khi nó đang chạy?


219

Hãy tưởng tượng một kịch bản python sẽ mất nhiều thời gian để chạy, điều gì sẽ xảy ra nếu tôi sửa đổi nó trong khi nó đang chạy? Kết quả sẽ khác nhau?


8
Chương trình được tải vào bộ nhớ chính của bạn. Nếu bạn thay đổi tập tin nguồn, không có gì xảy ra. Hãy tưởng tượng CPU sẽ đọc hướng dẫn từ ổ đĩa cứng ...
Felix Kling

15
@Felix: Đó gọi là "Thực thi tại chỗ" (XIP).
Ignacio Vazquez-Abrams

@Ignacio: Thật thú vị, tôi không biết điều đó. Cảm ơn :)
Felix Kling

3
Bạn có thể tự động tải lại mã của các mô-đun, xem stackoverflow.com/questions/437589/
triệt

2
Lưu ý rằng các tập tin batch của Windows làm thực hiện tại chỗ, vì vậy đây không phải là một câu hỏi giả thuyết, có những ngôn ngữ ra khỏi đó mà cư xử theo cách này.
yoyo

Câu trả lời:


259

Không có gì, vì Python biên dịch trước tập lệnh của bạn thành tệp PYC và khởi chạy nó.

Tuy nhiên, nếu một số loại ngoại lệ xảy ra, bạn có thể nhận được một lời giải thích hơi sai lệch, bởi vì dòng X có thể có mã khác với trước khi bạn bắt đầu tập lệnh.


10
Không nhất thiết phải vào một tập tin.
Ignacio Vazquez-Abrams

60
Nhưng nếu bạn khởi chạy lại trong khi chạy, khi các tệp pyc mới ghi đè lên tệp cũ, điều đó có gây ra sự cố trong chương trình đã chạy hay không?
giảm tốc

26
Chẳng có gì xảy ra. Tôi cũng đã kiểm tra nó trong một thử nghiệm nhỏ. Điều gì xảy ra: pyc chỉ là phần tổng hợp. Và phần tổng hợp này được tải vào RAM và sau đó được thực thi. Vì vậy, luôn có thể thay đổi chương trình, biên dịch lại và chạy một phiên bản khác, ví dụ như trong một bảng điều khiển khác.
Chris

7
@Chris Tôi đã bắt đầu một phiên bản kịch bản python của mình trong một bảng điều khiển. Trong khi nó đang chạy, tôi đã thay đổi hai dòng mã và bắt đầu một phiên bản khác trong một bàn điều khiển riêng. Sau một thời gian, tôi đã nhận được một lỗi được trả về từ bảng điều khiển đầu tiên về hai dòng mã mà tôi đã thay đổi sau khi bắt đầu nó! vui lòng giúp đỡ
double_j

14
@Chris Tôi nghĩ tôi biết những gì xảy ra ở đây. Nếu bạn sửa đổi tập lệnh và lưu trong khi nó đang chạy và các lỗi phiên bản trước đó, trong phần đọc theo dõi, nó sẽ mở phiên bản hiện tại của tệp và làm cho dấu vết trở nên khác so với khi bạn bắt đầu. Tôi đã nhìn thấy điều này bản thân mình trong nhiều dịp.
double_j
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.