IOError: [Errno 4] Sistem çağrısı kesme ile engellendi

Başlatan assasin, 06 Ağustos 2012 - 00:57:25

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

assasin

Python ve PyQt ile ufak bir program yazıyorum. Sitemle ilgili komutlar için subprocess modülünü kullanıyorum. Program uçbirimde iken sorunsuzdu ama Qt ile arayüz oluşturmaya başlayınca şu hatayla karşılaştım.

]Traceback (most recent call last):
  File "/home/bilal/Belgeler/Programlama/Projeler/wireless.pyw", line 98, in sonuc
    self.ipAl()
  File "/home/bilal/Belgeler/Programlama/Projeler/wireless.pyw", line 80, in ipAl
    print(subprocess.getoutput(x))
  File "/usr/lib/python3.2/subprocess.py", line 635, in getoutput
    return getstatusoutput(cmd)[1]
  File "/usr/lib/python3.2/subprocess.py", line 618, in getstatusoutput
    text = pipe.read()
IOError: [Errno 4] Sistem çağrısı kesme ile engellendi



İnternette araştırdım ama bir çözüm bulamadım. Bilgisi olan varsa ve yardım ederse sevinirim.
"Gerçeğin bilgisi deneyle başlar, deneyle biter." Einstein

ct

Python ve QT bilmiyorum o yüzden kod olarak cevap yazamıyorum. IP alma işlemi uzun süren bir işlem, bunun sonucunu almaya direkt read ile çalışılınca sorun çıkıyor anladığım kadarıyla. Önce bir dosyaya gönderip o işlem bittikten sonra oradan okuma yapmaya çalışabilirsiniz. Sanırım Unix sistemlere özel bir problem. Burada da validate_output diye bir şey önerilmiş:

http://stackoverflow.com/questions/8980050/persistent-python-subprocess

assasin

Dosyaya göndermek derken? Kusura bakmayın programlama bilgim çok geniş değil çıktıyı mı dosyaya yazdırmalıyım?


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 06 Ağustos 2012 - 02:33:55

Sanırım şu kısımdan bahsediyorsunuz:

Alıntı YapI think you're looking for

myprocess.stdin.write(text)

you could create a list of Popens and then call communicate on each element in another loop. something like this

processes=[]
for text in textcollection:
    myprocess = subprocess.Popen(["myexecutable"],
                stdin = subprocess.PIPE, stdout = subprocess.PIPE,
                stderr = None)
    myprocess.stdin.write(text)
    processes.append(myprocess)

for proc in processes:
    myoutput, err=proc.communicate()
    #do something with the output here

this way it won't have to wait until after all the Popens have started
"Gerçeğin bilgisi deneyle başlar, deneyle biter." Einstein

ct

@assasin,

f = open('/home/kullanıcıadı/calismadosyasi1', 'w')
f.write('yazdırılacak şey')
f.close()
f = open('/tmp/workfile', 'r')
f.read()


Şuna benzer bir yazdırıp okuma yapabiliyor musunuz? Ben de şimdi bakıp öğrendim nasıl dosya işlemi yapıldığını. Buffer kullanılması değişik geldi hatalı olabilir ama kendimde denedim dosyaya yazma ve dosyadan okuma işlemlerini yapabildim. 'yazdırılacak şey' kısmını kodunuza göre düzenlemeniz gerekiyor.

Şu kısmı kastetmiştim:

fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
for text in textcollection:
    myprocess.stdin.write(text + '\n')
    while True:
        myoutputtext = ''
        try:
            myoutputtext += myprocess.stdout.read()
        except IOError:
            pass
        if validate_output(myoutputtext):
            break
        time.sleep(.1)    # short sleep before attempting another read

assasin

Evet yazdırma bu şekilde yapılıyor ancak ben neyi yazdırmam gerektiğini anlayamadım. En iyisi fonksiyonu geçeyim buraya.


def ipAl(self):
subprocess.getoutput("sudo ip link set wlan0 up")
x = "sudo wpa_supplicant -B -D wext -i wlan0 -c ~/.wireless/{0}".format(ag)
print("Ip alınıyor...")
print(subprocess.getoutput(x))
print("Ip alındı!")


Şu adreste subprocess modülünü kullanılmasını söylemiş ancak ben zaten o modülü kullanıyorum.

http://stackoverflow.com/questions/7763740/pyqt4-interrupted-system-call-while-calling-commands-getoutput-in-timer
"Gerçeğin bilgisi deneyle başlar, deneyle biter." Einstein

ct

Çözüm bulamadım. Stackoverflowdan başka örneklere de baktım getoutput yerine hep communicate() fonsiyonu ile çıkışı (output) almışlar. getoutput sizin communicate() ile yazdığınız bir fonksiyon sanırım. Eğer öyle değilse belki işinize yarar.

assasin

Hayır getoutput() subprocess modülüne ait bir fonksiyon. Ama bir de communicate() ile deneyeyim.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 06 Ağustos 2012 - 15:12:06

Olmuyor maalesef. Problem sudo'yla ilgili sanırım bir kaynakta öyle yazmış ama o kaynakta sudo'nun 8. sürümü ile düzeldiği yazmış fakat bende düzelmedi.
"Gerçeğin bilgisi deneyle başlar, deneyle biter." Einstein