Làm cách nào để chuyển một lệnh gọi quy trình con tới tệp văn bản?


93
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])

RIght bây giờ tôi có một tập lệnh mà tôi chạy. Khi tôi chạy nó và nó chạm vào dòng này, nó bắt đầu in nội dung vì run.sh có bản in trong đó.

Làm cách nào để chuyển nó vào một tệp văn bản? (Và cũng có thể in, nếu có thể)

Câu trả lời:


171

Nếu bạn muốn ghi kết quả đầu ra vào một tệp, bạn có thể sử dụng stdout -argument of subprocess.call.

Nó cần None, subprocess.PIPEmột đối tượng tệp hoặc một bộ mô tả tệp. Đầu tiên là mặc định, stdout được kế thừa từ cha mẹ (tập lệnh của bạn). Thứ hai cho phép bạn chuyển từ một lệnh / quy trình sang lệnh khác. Thứ ba và thứ tư là những gì bạn muốn, để có đầu ra được ghi vào một tệp.

Bạn cần mở một tệp có nội dung như thế nào đó openvà chuyển đối tượng hoặc số nguyên của bộ mô tả tệp vào call:

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)

Tôi đoán bất kỳ đối tượng giống tệp hợp lệ nào sẽ hoạt động, như một ổ cắm (thở hổn hển :)), nhưng tôi chưa bao giờ thử.

Như marcog đã đề cập trong các nhận xét, bạn cũng có thể muốn chuyển hướng stderr, bạn có thể chuyển hướng này đến cùng một vị trí với stdout stderr=subprocess.STDOUT. Bất kỳ giá trị nào được đề cập ở trên cũng hoạt động, bạn có thể chuyển hướng đến những nơi khác nhau.


5
tại sao subprocess.call (["echo", "1", ">>", "t.txt"]) không hoạt động?
StackOverflowOfficial

7
@Goldname bạn cần một shell để chuyển hướng, do đó: subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)nên hoạt động.
Wes Mason,

@WesMason Cảm ơn, nhưng tôi nghĩ rằng subprocess.call hoạt động theo cách về cơ bản giống như sao chép và dán vào shell?
StackOverflowOfficial

2
@Goldname nah, mọi thứ trong quy trình con dựa vào lớp Popen bên dưới, lớp này sẽ mở ra một quy trình, shell = True sẽ buộc quy trình được thực thi trong trình bao mặc định của hệ thống (ví dụ: / bin / sh trên hệ thống POSIX, thường là bash hoặc dash ), nó an toàn hơn theo cách đó vì bạn không mở tất cả các chức năng bổ sung được cung cấp bởi shell (toàn bộ ngôn ngữ lập trình cho chính nó, với các khai thác riêng nếu truyền dữ liệu do người dùng cung cấp). Ngoài ra, hãy xem shlex.quoteliệu bạn có đang chuyển bất kỳ dữ liệu có thể bẩn nào sang vỏ con không.
Wes Mason,

4
Chúng ta cũng có nên đóng tệp sau khi hoàn thành không? điều này sẽ đóng tệp sau khi chúng tôi hoàn tất: with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel
alper

18

Các tùy chọn cho popencó thể được sử dụng trongcall

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0

Vì thế...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)

Sau đó, bạn có thể làm những gì bạn muốn với myoutput(cần phải là một tệp btw).

Ngoài ra, bạn có thể làm điều gì đó gần hơn với đầu ra đường ống như thế này.

dmesg | grep hda

sẽ là:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

Có rất nhiều thông tin hữu ích và đáng yêu trên trang hướng dẫn sử dụng python .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.