Bir alt işlem çağrısını bir metin dosyasına nasıl yönlendiririm?


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

Şimdi çalıştırdığım bir senaryom var. Çalıştırdığımda ve bu satıra ulaştığında, baskıya başlıyor çünkü run.sh içinde baskılar var.

Bunu bir metin dosyasına da nasıl aktarırım? (Mümkünse ayrıca yazdırın)

Yanıtlar:


179

Çıktıyı bir dosyaya yazmak istiyorsanız, stdout- bağımsız değişkenini kullanabilirsiniz subprocess.call.

O alır None, subprocess.PIPEbir dosya nesneyi veya bir dosya tanıtıcı. İlki varsayılandır, stdout, üst öğeden (betiğinizden) miras alınır. İkincisi, bir komuttan / işlemden diğerine geçiş yapmanızı sağlar. Üçüncü ve dördüncü, çıktının bir dosyaya yazılmasını istediğiniz şeydir.

Aşağıdakilere benzer bir şey içeren bir dosya açmanız openve nesne veya dosya tanımlayıcı tamsayısını şunlara iletmeniz gerekir call:

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

Dosya benzeri herhangi bir nesnenin bir soket gibi çalışacağını tahmin ediyorum (gasp :)), ama hiç denemedim.

Marcog'un yorumlarda bahsettiği gibi, stderr'i de yeniden yönlendirmek isteyebilirsiniz, bunu stdout ile aynı konuma yönlendirebilirsiniz stderr=subprocess.STDOUT. Yukarıda belirtilen değerlerden herhangi biri de çalışır, farklı yerlere yönlendirebilirsiniz.


6
neden subprocess.call (["echo", "1", ">>", "t.txt"]) çalışmıyor?
StackOverflowOfficial

7
@Goldname yeniden yönlendirme yapmak için bir kabuğa ihtiyacınız var, bu yüzden: subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)çalışmalı.
Wes Mason

@WesMason Teşekkürler, ancak subprocess.call'ın temelde kopyalamak ve kabuğa yapıştırmak gibi bir şekilde çalıştığını düşündüm.
StackOverflowOfficial

2
@Goldname nah, alt işlemdeki her şey, bir işlemi açan temel Popen sınıfına dayanır, shell = True, işlemi sistem varsayılan kabuğunda (örneğin, POSIX sistemlerinde, genellikle bash veya tire olan / bin / sh) çalıştırmaya zorlar. ), bu şekilde daha güvenlidir, çünkü kabuk tarafından sağlanan tüm ekstra işlevlere (kullanıcı tarafından sağlanan verileri aktarırsa kendi istismarları ile kendi başına bütün bir programlama dili). shlex.quoteOlası bir kirli veriyi bir alt kabuğa geçirip geçirmediğinize de bir göz atın .
Wes Mason

4
İşimiz bittikten sonra dosyayı da kapatmalı mıyız? bu işimiz bittikten sonra dosyayı kapatacak: with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel
alper

19

Seçenekleri popenşurada kullanılabilir:call

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

Yani...

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

Daha sonra istediğinizi yapabilirsiniz myoutput(ki bunun bir btw dosyası olması gerekir).

Ayrıca, bunun gibi bir borulu çıktıya daha yakın bir şey yapabilirsiniz.

dmesg | grep hda

olabilir:

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

Python kılavuz sayfasında pek çok güzel ve faydalı bilgi var .


-2

Ayrıca, yardımcı olacaksa, komut dosyasını terminalden çağırarak her şeyi bir dosyaya yazdırabilirsiniz. Bu yoldan:

$ /path/to/the/script.py > output.txt

Bu dosyanın üzerine yazacaktır. >>Eklemek için kullanabilirsiniz .

Hataların dosyaya da kaydedilmesini istiyorsanız, &>>veya kullanın &>.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.