Làm cách nào tôi có thể gọi chương trình bên ngoài bằng tập lệnh python và truy xuất mã đầu ra và trả về?Làm thế nào để gọi một chương trình bên ngoài trong python và lấy đầu ra và trả về mã?
Trả lời
Nhìn vào subprocess mô-đun: một ví dụ đơn giản sau ...
from subprocess import Popen, PIPE
process = Popen(["ls", "-la", "."], stdout=PIPE)
(output, err) = process.communicate()
exit_code = process.wait()
Tôi đã chỉnh sửa câu trả lời ở trên để phản ánh đề xuất của Ambroz trong trường hợp ai đó làm không đọc nhận xét và sử dụng mã không chính xác trước đó. –
nếu điều này không vì lý do nào đó, bạn có thể muốn thêm shell = True vào các tham số (khi ở trong cửa sổ?) – ntg
Dường như [giải pháp trên] (https://stackoverflow.com/a/707001/1321680) có thể được thay thế bằng lệnh gọi đơn giản ['subprocess.run()'] (https://docs.python.org/dev/library/subprocess.html#subprocess.run) (Python> = 3.5 là bắt buộc). –
Kiểm tra các mô-đun subprocess đây: http://docs.python.org/library/subprocess.html#module-subprocess. Nó sẽ nhận được những gì bạn cần làm.
Tiếp theo bình luận trước Ambrož Bizjak của, đây là một giải pháp mà làm việc cho tôi:
import shlex
from subprocess import Popen, PIPE
cmd = "..."
process = Popen(shlex.split(cmd), stdout=PIPE)
process.communicate()
exit_code = process.wait()
Đây là câu trả lời hay nhất. – dotancohen
Tôi có một bài viết tương tự [ở đây] (https://stackoverflow.com/questions/1996518/retrieving-the-output-of-subprocess-call/21000308#21000308) cho thấy làm thế nào để có được ba điều từ một quá trình: exitcode , stdout, stderr. – Jabba
Sau khi một số nghiên cứu, tôi có đoạn mã sau đó hoạt động rất tốt đối với tôi. Về cơ bản nó in cả stdout và stderr trong thời gian thực. Hy vọng nó sẽ giúp người khác cần nó.
stdout_result = 1
stderr_result = 1
def stdout_thread(pipe):
global stdout_result
while True:
out = pipe.stdout.read(1)
stdout_result = pipe.poll()
if out == '' and stdout_result is not None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
def stderr_thread(pipe):
global stderr_result
while True:
err = pipe.stderr.read(1)
stderr_result = pipe.poll()
if err == '' and stderr_result is not None:
break
if err != '':
sys.stdout.write(err)
sys.stdout.flush()
def exec_command(command, cwd=None):
if cwd is not None:
print '[' + ' '.join(command) + '] in ' + cwd
else:
print '[' + ' '.join(command) + ']'
p = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd
)
out_thread = threading.Thread(name='stdout_thread', target=stdout_thread, args=(p,))
err_thread = threading.Thread(name='stderr_thread', target=stderr_thread, args=(p,))
err_thread.start()
out_thread.start()
out_thread.join()
err_thread.join()
return stdout_result + stderr_result
tôi đã phát triển một chút thư viện (py-execute) cho phép bạn thực hiện các chương trình bên ngoài, lấy đầu ra và retcode và, cùng một lúc nhận được kết quả trong giao diện điều khiển trong thời gian thực:
>>> from py_execute.process_executor import execute
>>> ret = execute('echo "Hello"')
Hello
>>> ret
(0, 'Hello\n')
Bạn có thể tránh in ấn để an ủi đi qua một user_io giả:
>>> from mock import Mock
>>> execute('echo "Hello"', ui=Mock())
(0, 'Hello\n')
tôi đã viết nó vì với đồng bằng Popen (Trong Python 2.7) tôi đã gặp khó khăn trong thực hiện comm ands với đầu ra dài
- 1. Gọi chương trình bên ngoài từ python và lấy đầu ra
- 2. Nhận trạng thái trả về và đầu ra chương trình
- 3. Python - làm thế nào để tôi gọi các chương trình python bên ngoài?
- 4. Gọi Python từ PHP và lấy mã trả lại
- 5. Đầu ra của chương trình và thời gian Python
- 6. Chạy chương trình bên ngoài từ Java, đọc đầu ra, cho phép gián đoạn
- 7. Làm thế nào để chạy chương trình bên ngoài thông qua một chương trình C#?
- 8. Làm thế nào tôi có thể chạy một chương trình bên ngoài từ C và phân tích đầu ra của nó?
- 9. Làm thế nào để thực hiện một lệnh bên ngoài và nắm bắt đầu ra của nó trong perl6?
- 10. chương trình Ngoài ra đơn giản trong python
- 11. Đọc đầu ra nhị phân của một chương trình bên ngoài trong Common Lisp
- 12. Làm thế nào để tôi nhận được scons để gọi một kịch bản bên ngoài?
- 13. Chạy chương trình từ Emacs và không đợi đầu ra
- 14. Làm thế nào để chạy chương trình Java và nhận đầu ra trong PHP?
- 15. Làm thế nào để gọi hàm bên ngoài bên trong mã jquery từ html?
- 16. Làm thế nào để đầu ra chương trình ống trong một trình soạn thảo?
- 17. Làm thế nào tôi có thể chạy một lệnh bên ngoài và nắm bắt đầu ra của nó trong Perl?
- 18. Làm thế nào để gọi url bên ngoài trong jquery?
- 19. lấy mã thoát cho chương trình python
- 20. Làm thế nào để chạy chương trình Java trong thiết bị đầu cuối với thư viện bên ngoài JAR
- 21. Làm thế nào để nắm bắt đầu ra stdout từ một cuộc gọi hàm Python?
- 22. Dạy OOP (C++) cách tiếp cận bên ngoài và bên trong ra ngoài
- 23. Làm thế nào để trả về JSON trong python bình lấy từ một url khác cho trình duyệt?
- 24. Làm thế nào để trả về một mảng char được tạo ra trong hàm?
- 25. Làm thế nào để chạy ứng dụng C# bên trong một trình biên dịch mã khác với chạy một trình biên dịch mã bên ngoài?
- 26. Làm thế nào để có được IP bên ngoài của một ổ cắm bằng Python?
- 27. Ràng buộc khóa. Làm thế nào để chạy một kịch bản bên ngoài (lệnh/chương trình bên ngoài) trong văn bản cao cấp 2 khi nhấn một phím?
- 28. Truyền tham số và giá trị trả về cho một chương trình con trong assembly
- 29. Làm cách nào để thực thi lệnh Windows bên ngoài và ngay lập tức trả về trong Perl?
- 30. Tải tài liệu về OpenOffice bằng chương trình Python bên ngoài
Có một số câu hỏi và câu trả lời hiện có về SO sẽ giúp bạn: http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python –
Có thể trùng lặp của [Gọi một lệnh bên ngoài bằng Python] (http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) –