Subprocess Modülünün Kullanımı!

Öncelikle herkeze tekrardan merhaba 2 sayfa olarak yazdığım örnek kodda hata almaktayım
client tarafında gelen cevap server tarafına yollanırken hata vermekte sebebi sizce nedir ?

Server kodları :

 import socket
host="127.0.0.1"
port=5000
soket=socket.socket()
soket.bind((host,port))
soket.listen(1)
conn , addr = soket.accept()
print("Bağlantı sağlandı:",str(conn))
mesaj="Bağlantu sağlandı".encode()
conn.send(mesaj)
while True:
    komut=input("Komut : ")
    conn.send(komut.encode())
    if komut.lower()=="exit":
        break
    sonuc=conn.recv(1024).decode()
    print(sonuc)
conn.close()
soket.close()

Client tarafı normalde hiç bir hata vermez iken ipconfig gibi bir komutun çıktısını yollarken hata veriyor

import socket
import subprocess
host="127.0.0.1"
port=5000
soket=socket.socket()
soket.connect((host,port))
mesaj=soket.recv(1024).decode()
print(mesaj)
while True:
    komut=soket.recv(1024).decode()
    if komut.lower()=="exit":
        break
    cikti = subprocess.getoutput(komut)          !!!! hata tam olarak burda sebebi nedir sizce ?
    soket.send(cikti.encode())
soket.close()

çıktıyı yazdırmayı denermisiniz

Bağlantı sağlandı
dir
Traceback (most recent call last):
  File "C:\Users\exfig\OneDrive\Masaüstü\python projelerım\kurban.py", line 14, in <module>
    cikti = subprocess.getoutput(komut)
  File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 630, in getoutput
    return getstatusoutput(cmd)[1]
  File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 611, in getstatusoutput
    data = check_output(cmd, shell=True, text=True, stderr=STDOUT)
  File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 411, in check_output
    **kwargs).stdout
  File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 490, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\subprocess.py", line 951, in communicate
    stdout = self.stdout.read()
  File "C:\Users\exfig\AppData\Local\Programs\Thonny\lib\encodings\cp1254.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 114: character maps to <undefined>
>>>

decode ve encode fonksiyonlarını utf-8 kullanacak şekilde ayarlar mısınız? Yani şöyle:

X.decode("utf-8")
#Ve
X.encode("utf-8")

aynı hatayı vermekte hocam olmadı malesef :frowning:

subprocess yerine os system komutunu kullanarak denermisiniz

Merhaba,

utf-8 veya cp1254 yerine cp850 veya cp857 kodlamalarından birini kullanmayı deneyin.

import subprocess

command = subprocess.Popen(
	"dir",
	shell=True,
	stdout=subprocess.PIPE
).communicate()[0].decode("cp850")
print(command)

Ne yazıkki aynı hatayı almaya devam ediyorum editörümü değiştirip tekrar deniyeceğim bakalım.

Editörle alakalı olduğunu sanmıyorum. Bir ihtimal, Windows ile alakalı. Ayrıca, subprocess.getoutput fonksiyonu yerine, subprocess.Popen sınıfını kullanmayı deneyin, belki bununla da ilgilidir.

Paylaştığım kodu çalıştırdınız mı merak ettim, çalıştırdıysanız nasıl bir sonuç aldınız? Windows’u açıp denemiştim ve hata almamıştım.

Ayrıca sizinle paylaştığım sitedeki farklı kodlamaları da deneyebilirsiniz.

cp850 veya cp857 kodlarını denedim aynı hatayı vermekte
subprocess.popen kodunu şuan deniyorum.

import subprocess

command = subprocess.Popen(
	"dir",
	shell=True,
	stdout=subprocess.PIPE
).communicate()[0].decode("cp850")
print(command)

verdiğiniz Popen komutu ile dataları sorunsuz bir şekilde servera ilettin çok teşekkür ederim büyük ihtimal sorun subprocess.geoutput() kullanmadan kaynaklı Popen ile hatasız çalışıyor. :slight_smile:

1 Beğeni

Server tarafı :

    import socket                                                                   #<-------Socket kütüphanesi yüklenir
    host="127.0.0.1"                                                                #<-------Bağlanılacak ip belirlenir
    port=5000                                                                       #<-------Bağlanılacak port belirlenir
    soket=socket.socket()                                                           #<-------Socket Oluşturulur
    soket.bind((host,port))                                                         #<-------Socket ip ve port dinlenir
    soket.listen(1)                                                                 #<-------Sockete bağlanılacak client sayısı belirlenir
    conn , addr = soket.accept()                                                    #<-------Gelen istekler kabuledilir
    print("Bağlantı sağlandı:",str(conn))                                           #<-------Bağlantı geldiğinde  ekrana yazılır
    conn.sendall(bytes("Veriler Aktarılıyor Lütfen Bekleyiniz !! ".encode("cp850")))#<-------Karşı client'a mesaj encode edilerek gönderilir
    while True:                                                                     #<-------Koşullar doğru ise döngüye girilir
        komut=input("Komut Giriniz : ")                                             #<-------Kullanıcıdan çalıştırılacak komut istenir
        conn.send(komut.encode("cp850"))                                            #<-------Girilen komut Karşı client'a encode edilerek gönderilir
        if komut.lower()=="exit":                                                   #<-------Girilen komut exit ise döngüden çıkılır
            break                                                                   #<-------Döngüden çıkılır
        sonuc=conn.recv(4048).decode("cp850")                                       #<-------Karşı client'tam gelen Veriler veri değişkenine atılır
        print(sonuc)                                                                #<-------Veriler ekrana yazdırılır
    conn.close()                                                                    #<-------Bağlantı kapatılır
    soket.close()                                                                   #<-------Socket kapatılır

Client tarafı :

import socket                                                                                           #<-------Socket kütüphanesi yüklenir
import subprocess                                                                                       #<-------subprocess kütüphanesi yüklenir
host="127.0.0.1"                                                                                        #<-------Bağlanılacak ip belirlenir
port=5000                                                                                               #<-------Bağlanılacak port belirlenir
soket=socket.socket()                                                                                   #<-------Socket Oluşturulur
soket.connect((host,port))                                                                              #<-------Belirtilen ip ve porta bağlanılır
mesaj=soket.recv(4048).decode("cp850")                                                                  #<-------Server dam ilk mesaj alınır
print(mesaj)                                                                                            #<-------Alınan mesaj ekrana basılır
while True:                                                                                             #<-------Koşullar doğru ise döngüye girilir
    komut=soket.recv(4048).decode("cp850")                                                              #<-------Server dan alınan komut verileri komut değişkenine aktarılır
    veri = subprocess.Popen(komut,shell=True,stdout=subprocess.PIPE).communicate()[0].decode("cp850")   #<-------Aktarılan komut shell üzerinden çalıştırılıp sonucu veri değişkenine aktarılır
    soket.send(veri.encode("cp850"))                                                                    #<-------Aktarılan veriler server encode edilerek yollanır
    if komut.lower()=="exit":                                                                           #<-------Eğer serverdan exit komutu gelirse döngüden çıkılır
        break                                                                                           #<-------Döngüden çıkılır
soket.close()                                                                                           #<-------Soket kapatılır

Yardımcı olup konuya mesaj atan herkeze teşekkür ederim bütün isteklerimi yerine getiriyor :+1: