2010-01-21 31 views
8

Tôi đang viết chương trình Python, nếu người dùng thay đổi cài đặt trong khi chạy, cần phải khởi động lại để áp dụng các cài đặt đã thay đổi. Có cách nào để làm điều này? Tôi đang nghĩ đến một cái gì đó dọc theo dòng:Khởi động lại Chương trình Python

import sys 
command_line = ' '.join(sys.argv) 
# Now do something with command_line 
# Now call my custom exit procedure 

Lưu ý: Tôi đang trên Windows, nếu mà làm cho một sự khác biệt

+0

trên quy trình nền UNIX thường sử dụng trình xử lý tín hiệu, kiểm tra mô-đun tín hiệu trong python. bạn có thể có thể làm tương tự trong Windows – Anycorn

+0

liên quan: [Có thể đặt cờ python -O (tối ưu hóa) trong một tập lệnh không?] (http://stackoverflow.com/q/7527055/4279) – jfs

Trả lời

8

tôi sẽ bỏ qua tất cả những cảm giác lo lắng bạn đang có khả năng để có được từ cố gắng để tái -run mình và để nó trong tay của môi trường.

Bằng cách đó, tôi có nghĩa là:

  1. Có một chương trình kiểm soát mà không gì hơn là chạy chương trình của bạn (với các thông số tương tự nó đã được đưa ra) trong một vòng lặp trong khi chương trình của bạn thoát ra với một "khởi động lại cụ thể "mã. Điều này có thể đơn giản như một tệp cmd hoặc phức tạp như một chương trình Python (rất đơn giản) khác sử dụng os.system). Về cơ bản, miễn là chương trình điều khiển lấy mã "khởi động lại", nó sẽ chạy lại chương trình của bạn với chính xác các tham số tương tự. Bất kỳ mã nào khác sẽ khiến mã đó thoát với mã đó.

  2. Khi bạn muốn thoát hoàn toàn, hãy thoát khỏi chương trình Python thực bằng mã trả về 0 (hoặc bất kỳ thứ gì không phải là mã "khởi động lại" trong tình huống lỗi).

  3. Nếu bạn chỉ muốn chuyển sang một lần lặp lại chương trình của mình (để đọc lại cấu hình chẳng hạn), hãy thoát bằng mã "khởi động lại" được chương trình kiểm soát nhận ra.

Nhưng bạn cũng có thể muốn suy nghĩ về việc tái kỹ thuật ứng dụng của mình để có thể đọc lại cấu hình của ứng dụng bất kỳ lúc nào. Điều này sẽ làm cho toàn bộ vấn đề biến mất. Bạn không đề cập đến lý do tại sao đó không phải là một lựa chọn vì vậy tôi giả sử bạn có một số lý do tại sao nó sẽ không hoạt động.

Nhưng, nếu không, đó là con đường tôi muốn chọn.

Để cung cấp một số mẫu mã cho các tùy chọn đầu tiên (đây là trên Windows nhưng dưới Cygwin - các quy tắc cơ bản giống nhau nên áp dụng cho Windows Python bản địa nhưng bạn nên kiểm tra giá trị trả về từ os.system) .:

> cat phase1.py 
#!/usr/bin/python 
import os 
status = 9 
while status == 9: 
    status = int(os.system ("./phase2.py")/256) # exit code is upper 8 bits 
    print "Controller: %d"%(status) 

 

> cat phase2.py 
#!/usr/bin/python 
import sys 
import time 
time.sleep(1) 
val = int(time.time())%10 
if val == 0: 
    rc = 0 
else: 
    rc = 9 
print "Program: %d -> %d"%(val,rc) 
sys.exit(rc) 

 

> ./phase1.py 
Program: 2 -> 9 
Controller: 9 
Program: 3 -> 9 
Controller: 9 
Program: 4 -> 9 
Controller: 9 
Program: 5 -> 9 
Controller: 9 
Program: 7 -> 9 
Controller: 9 
Program: 8 -> 9 
Controller: 9 
Program: 9 -> 9 
Controller: 9 
Program: 0 -> 0 
Controller: 0 

Bạn có thể xem bộ điều khiển bằng mã thoát 9 để quyết định xem có chạy lại chương trình hay không. Chương trình chính nó là một câm mà trả về 9, trừ khi nó trên một bội 10 giây.

5

Trên unix, bạn có thể sử dụng os.execl gia đình của các chức năng:

Những chức năng tất cả thực hiện một chương trình mới, thay thế cho quá trình hiện hành; họ không trở lại. Trên Unix, tệp thực thi mới được tải vào quy trình hiện tại và sẽ có cùng một id quá trình với tư cách người gọi. Lỗi sẽ được báo cáo là ngoại lệ OSError.

Trên cửa sổ, hãy xem gia đình os.spawnl, ít hiệu quả hơn các cuộc gọi unix.

+0

'os.execl() 'cũng hoạt động trên Windows. – jfs

Các vấn đề liên quan