Tôi đã xem xét một chút nhưng tôi không thể giải quyết được vấn đề này. Tôi muốn thực thi một kịch bản python trong một cái nhìn của ứng dụng django của tôi. Tôi đã đặt mã tôi muốn thực hiện bên trong một lệnh quản lý django để nó có thể được truy cập thông qua dòng lệnh python manage.py command-name
. Sau đó tôi đã cố gắng chạy lệnh này bằng cách sử dụng subprocess.Popen("python manage.py command-name",shell=True)
.Thực thi kịch bản python bằng cách sử dụng subprocess.Popen() trong chế độ xem django
Tuy nhiên, lệnh này có thể mất chút thời gian để thực thi vì vậy tôi muốn chế độ xem tiếp tục và cho phép tập lệnh thực thi trong nền. Sử dụng subprocess.Popen một mình dường như gây ra quan điểm để treo cho đến khi kịch bản đã hoàn thành, vì vậy tôi cố gắng sử dụng một sợi (sau another SA câu hỏi):
class SubprocessThread(threading.Thread):
def __init__(self, c):
self.command = c
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen(self.command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
và sau đó thực hiện nó:
t = SubprocessThread("python manage.py command-name")
t.setDaemon(True)
t.start()
t.join()
Tuy nhiên, khung nhìn vẫn bị treo: con trỏ có biểu tượng bận và AJAX trên trang không tải. Nếu không thì html của trang có vẻ như nạp tiền và các lệnh trong khung nhìn sau khi cuộc gọi thread xuất hiện để kết thúc bình thường (trước khi kịch bản kết thúc). Ai đó có thể vui lòng giúp tôi? Tôi muốn kịch bản để thực thi và làm điều riêng của mình mà không cần phải giữ chế độ xem hoặc các cuộc gọi AJAX trên trang.
Tôi thường xuyên sử dụng một mẫu tương tự (với một 'quy trình con', vì' thread' bị giết khi chức năng xem thoát) và tôi thường xuyên quên trả lại thứ gì đó trong xem chức năng, khiến trình duyệt bị treo. Sau đó, tôi đổ lỗi cho các subporcess, trong khi tôi chỉ quên trả lại một 'HttpResponse'. Kiểm tra xem! – Dunatotatos