2010-09-30 2 views
5

Tôi đang cố gắng sử dụng Python (thông qua khung công tác Django) để thực hiện cuộc gọi dòng lệnh Linux và đã thử cả os.system và os.open nhưng đối với cả hai dạng này, dường như kịch bản Python bị treo sau khi thực hiện lệnh gọi cuộc gọi là để instantiating một máy chủ (vì vậy nó không bao giờ "kết thúc" như nó có nghĩa là dài hạn). Tôi biết để làm một cái gì đó như thế này với mã Python khác bạn có thể sử dụng một cái gì đó như cần tây nhưng tôi figured sẽ có một cách đơn giản để có được nó chỉ cần thực hiện một cuộc gọi dòng lệnh và không được "gắn vào nó" để nó chỉ có thể di chuyển quá khứ, tôi tự hỏi nếu tôi đang làm điều gì đó sai ... cảm ơn cho lời khuyên nào.Python, sử dụng os.system - Có cách nào để tập lệnh Python chuyển qua không cần chờ cuộc gọi kết thúc?

Tôi đang thực hiện cuộc gọi như thế này hiện

os.system("command_to_start_server") 

cũng đã cố gắng:

response = os.popen("command_to_start_server") 

Trả lời

9

Tôi không chắc chắn, nhưng tôi nghĩ the subprocess module với nó Popen linh hoạt hơn nhiều so với os.popen. Nếu tôi nhớ lại chính xác nó bao gồm sinh sản quá trình không đồng bộ, mà tôi nghĩ là những gì bạn đang tìm kiếm.

Chỉnh sửa: Đã một thời gian kể từ khi tôi sử dụng mô-đun phụ, nhưng nếu tôi không nhầm, subprocess.Popen sẽ trả về ngay lập tức và chỉ khi bạn cố gắng giao tiếp với quy trình (chẳng hạn như đọc đầu ra của nó) bằng cách sử dụng subprocess.communicate khối chương trình của bạn chờ đợi đầu ra nếu không có.

+0

cảm ơn, điều này nghe có vẻ tốt hơn so với những gì tôi đang làm ... có một số điều lạ " ràng buộc "loại hành vi xảy ra khi tôi thực hiện dòng cmd cách tôi đã thông qua một đối tượng được bắt đầu từ Django, cuộc gọi tôi đã thực hiện trên dòng cmd là để bắt đầu một máy chủ thử nghiệm (trên cổng khác) nhưng bằng cách nào đó mà được ràng buộc với máy chủ thử nghiệm Django nơi nó gây ra máy chủ thử nghiệm Django thất bại mặc dù tôi bình thường có thể chạy chúng cả hai cùng một lúc khi tôi bắt đầu chúng bằng tay từ dòng cmd – Rick

0

Hãy thử:

os.system("command_to_start_server &>/dev/null &") 
+0

Cảm ơn, điều đó đã hoạt động mặc dù nó vẫn cho một số hành vi lạ như trang đầu ra ở Django (mặc dù hiển thị kết quả cuối cùng) vẫn hiển thị "Đang tải" vô thời hạn ... nhưng làm những gì bạn nói. phần mà nó đã "treo" – Rick

+0

bây giờ nó chuyển hướng toàn bộ đầu ra tới/dev/null, vì vậy không có gì hiển thị trên trang – tamasd