2011-08-20 31 views
8

Trong Python, Nếu tôi đang sử dụng "wget" để tải về một tập tin sử dụng os.system ("wget), nó sẽ hiển thị trên màn hình như:Python: Làm thế nào để ngăn chặn đầu ra của os.system

Resolving... 

Connecting to ... 

HTTP request sent, awaiting response... 

100%[====================================================================================================================================================================>] 19,535,176 8.10M/s in 2.3s 

vv trên màn hình

những gì tôi có thể làm để tiết kiệm đầu ra này trong một số tập tin chứ không phải hiển thị nó trên màn hình

Hiện nay tôi đang chạy lệnh như sau:.?

theurl = ".210 location file> "

downloadCmd =" ​​wget "+ theurl

os.system (downloadCmd)

+3

tại sao bạn gọi điện thoại wget ở địa điểm đầu tiên thay vì sử dụng thứ gì đó từ thư viện chuẩn của python? – geoffspear

+0

Bạn có thể giải thích nó bằng một số ví dụ ... – nsh

Trả lời

5

Để trả lời câu hỏi trực tiếp của bạn và như những người khác đã đề cập, bạn nên cân nhắc sử dụng mô-đun subprocess. Dưới đây là ví dụ:

from subprocess import Popen, PIPE, STDOUT 

wget = Popen(['/usr/bin/wget', theurl], stdout=PIPE, stderr=STDOUT) 
stdout, nothing = wget.communicate()  

with open('wget.log', 'w') as wgetlog: 
    wgetlog.write(stdout) 

Nhưng, không cần phải gọi ra hệ thống để tải xuống tệp, hãy để python thực hiện việc nâng hạng nặng cho bạn.

Sử dụng urllib,

try: 
    # python 2.x 
    from urllib import urlretrieve 
except ImportError: 
    # python 3.x 
    from urllib.request import urlretrieve 

urlretrieve(theurl, local_filename) 

Hoặc urllib2,

import urllib2 

response = urllib2.urlopen(theurl) 
with open(local_filename, 'w') as dl: 
    dl.write(response.read()) 

local_filename là con đường nơi mà bạn chọn. Đó là đôi khi có thể tự động xác định giá trị này, nhưng cách tiếp cận phụ thuộc vào hoàn cảnh của bạn.

+0

Tôi nhận được lỗi sau: Tệp "python.py", dòng 129 với mở ('wget.log', 'w') là wgetlog: ^ Cú phápError: cú pháp không hợp lệ – nsh

+0

Không sử dụng từ khóa "với "và" là ", nó hoạt động thành công .... wget = Popen (['/ usr/bin/wget', theurl], stdout = PIPE, stderr = STDOUT) stdout, nothing = wget.communicate() wgetlog = open ('wget.log', 'w') wgetlog.write (stdout) – nsh

+0

@nsh Có, xin lỗi. [Với tuyên bố] (http://docs.python.org/reference/compound_stmts.html#the-with-statement) được kích hoạt theo mặc định trong python 2.6 và cao hơn, bạn có thể kích hoạt nó trong python 2.5 bằng cách thêm 'từ __future__ nhập with_statement' làm lần nhập đầu tiên. Nếu bạn đang sử dụng python 2.4 hoặc trước đó, hãy xem http://stackoverflow.com/questions/3770348/how-to-safely-open-close-files-in-python-2-4 – Marty

0

Quá trình wget chỉ là văn bản cho STDOUT (và có lẽ thiết bị lỗi chuẩn nếu có điều gì xấu xảy ra) và đây là những vẫn "có dây" cho thiết bị đầu cuối.

Để khiến ứng dụng ngừng thực hiện việc này, chuyển hướng (hoặc đóng) cho biết tệp thủ công. Nhìn vào mô-đun subprocess cho phép định cấu hình các tệp đã cho biết khi bắt đầu quá trình. (os.system chỉ để lại STDOUT/STDERR của quá trình sinh sản một mình và do đó chúng được thừa hưởng nhưng mô-đun subprocess linh hoạt hơn.)

Xem nhiều ví dụ và giải thích tốt đẹp (nó giới thiệu các khái niệm về STDIN/STDOUT/STDERR và hoạt động từ đó).

Có nhiều cách tốt hơn để xử lý việc này hơn là sử dụng wget - nhưng tôi sẽ để lại như vậy cho các câu trả lời khác.

Mã hóa vui vẻ.

+0

Tôi đã nhập quy trình phụ mô-đun. Sau đó, tôi đang sử dụng nó như sau -----> process = subprocess.Popen (downloadCmd, shell = False, stdout = subprocess.PIPE) Nhưng nó cho tôi lỗi: File "/usr/lib64/python2.4/ subprocess.py ", dòng 550, trong __init__ errread, errwrite) Tệp" /usr/lib64/python2.4/subprocess.py ", dòng 996, trong _execute_child tăng child_exception OSError: [Errno 2] Không có tệp nào hoặc thư mục – nsh

20

Các chức năng os.system chạy lệnh thông qua trình bao, vì vậy bạn có thể đặt bất kỳ chuyển hướng stdio nào ở đó. Bạn cũng nên sử dụng cờ -q (yên tĩnh) để wget.

cmd = "wget -q " + theurl + " >/dev/null 2>&1" 

Tuy nhiên, có những cách tốt hơn để làm điều này trong python, chẳng hạn như các wrapper pycurl cho libcurl, hoặc "chứng khoán" urllib2 module.

1

Như những người khác đã lưu ý, bạn có thể sử dụng mô-đun thư viện gốc của Python để làm I/O hoặc bạn có thể sửa đổi dòng lệnh để chuyển hướng đầu ra.

Nhưng để kiểm soát toàn bộ đầu ra, điều tốt nhất là sử dụng mô-đun Python subprocess thay vì os.system(). Sử dụng subprocess sẽ cho phép bạn nắm bắt đầu ra và kiểm tra nó, hoặc nạp dữ liệu tùy ý vào đầu vào tiêu chuẩn.

Khi bạn muốn chạy một cách nhanh chóng và bẩn, hãy sử dụng os.system(). Khi bạn muốn kiểm soát hoàn toàn cách bạn chạy một cái gì đó, hãy sử dụng subprocess.

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