2012-03-16 38 views
7

Tôi cần chạy lệnh linux này từ python và gán đầu ra cho biến.Chạy lệnh linux từ python

ps -ef | grep rtptransmit | grep -v grep 

Tôi đã thử sử dụng thư viện lệnh pythons để thực hiện việc này.

import commands 
a = commands.getoutput('ps -ef | grep rtptransmit | grep -v grep') 

Nhưng sẽ bị cắt. Kết quả tôi nhận được là:

'nvr  20714 20711 0 10:39 ?  00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media camera=6 stream=video substream=1 client_a' 

nhưng sản lượng dự kiến ​​là:

nvr  20714 20711 0 10:39 ?  00:00:00 /opt/americandynamics/venvr/bin/rtptransmit setup_req db=media camera=6 stream=video substream=1 client_address=192.168.200.179 client_rtp_port=6970 override_lockout=1 clienttype=1 

Có ai biết làm thế nào để ngăn chặn đầu ra từ việc cắt đứt hoặc bất cứ ai có thể đề nghị phương pháp khác?

Trả lời

8

ps rõ ràng giới hạn sản lượng của nó để phù hợp với chiều rộng coi của nhà ga. Bạn có thể ghi đè chiều rộng này bằng biến môi trường $COLUMNS hoặc với tùy chọn --columns tới ps.

Mô-đun commands không còn được dùng nữa. Sử dụng subprocess để nhận kết quả của ps -ef và lọc đầu ra bằng Python. Không sử dụng shell=True theo đề nghị của câu trả lời khác, nó chỉ đơn giản là không cần thiết trong trường hợp này:

ps = subprocess.Popen(['ps', '-ef', '--columns', '1000'], stdout=subprocess.PIPE) 
output = ps.communicate()[0] 
for line in output.splitlines(): 
    if 'rtptransmit' in line: 
     print(line) 

Bạn cũng có thể muốn lấy một cái nhìn pgrep lệnh bằng cách mà bạn có thể trực tiếp tìm kiếm các quy trình cụ thể.

3

Tôi thường sử dụng subprocess để chạy lệnh bên ngoài. Đối với trường hợp của bạn, bạn có thể thực hiện một số việc như sau

from subprocess import Popen, PIPE 

p = Popen('ps -ef | grep rtptransmit | grep -v grep', shell=True, 
      stdout=PIPE, stderr=PIPE) 
out, err = p.communicate() 

Kết quả sẽ ở biến số out.

+1

-1 cho việc sử dụng vô dụng 'grep' và' shell = True'. – lunaryorn

+0

'Trình bao' là cần thiết nếu bạn muốn sử dụng đường ống trong lệnh. Về 'grep', tôi thực sự chỉ sao chép và dán lệnh từ câu hỏi. Điều đó 'grep' tôi nghi ngờ thứ hai là có bởi vì đôi khi lệnh' grep' mà chúng ta thực thi cũng có vẻ là grep-ed và do đó cần phải được loại bỏ. Điều này thực sự có thể tránh được bằng cách sử dụng 'grep [r] tptransmit' – fajran

+0

Tôi biết rằng' shell = True' là cần thiết để sử dụng một đường ống trong lệnh, và rằng 'grep' thứ hai là để loại bỏ lệnh' grep' đầu tiên khỏi danh sách quá trình lọc. Nhưng cả hai, các đường ống và 'grep' là thừa trong trường hợp này. – lunaryorn

4

commands không được dùng nữa, bạn không nên sử dụng. Sử dụng subprocess thay

import subprocess 
a = subprocess.check_output('ps -ef | grep rtptransmit | grep -v grep', shell=True) 
+2

-1 cho việc sử dụng vô dụng 'grep' và' shell = True'. – lunaryorn

+0

@lunaryorn: câu hỏi là làm thế nào để chạy lệnh đó trong Python, không phải cách grep đó trong Python. – vartec

+0

Trên thực tế, câu hỏi là làm thế nào để tránh cắt ngắn đầu ra 'ps'. Nhưng điều đó không mâu thuẫn với quan điểm của tôi ... – lunaryorn

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