Seite 1 von 1

kleines Problem mit subprocess?!

Verfasst: Sonntag 21. Mai 2017, 15:28
von wese
Hallo,

Ich führe per subProcess den Befehl [mount -t cifs //xxx.xxx.xxx.xxx/test /mnt/windowsordner1 -o username=xxxx,password=xxx]
aus, die IP Adresse habe ich hierfür absichtlich falsch eingestellt um eine Fehlermeldung zu erhalten.
Wenn ich nun das Programm ausführe, wird in der Textconsole auch die zu erwartende Fehlermeldung angezeigt, jedoch liefert stdout
seltsamerweise keine Rückgabewerte, die Frage wäre nun wieso dies so ist.

pi@raspberrypi:~ $ sudo ./create_network_directory.py
Retrying with upper case share name
mount error(6): No such device or address
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
b''

Code: Alles auswählen

#!/usr/bin/env python3

import subprocess

cmd_1 = ['mount -t cifs //xxx.xxx.xxx.xxx/test /mnt/windowsordner1 -o username=xxxx,password=xxx']
#cmd_1 = ['lsusb']
my_ip = subprocess.Popen(cmd_1,stdout=subprocess.PIPE, shell=True)
(IP,errors) = my_ip.communicate()
my_ip.stdout.close()
print(IP)

Re: kleines Problem mit subprocess?!

Verfasst: Sonntag 21. Mai 2017, 17:08
von BlackJack
@wese: Fehlermeldungen werden üblicherweise auf `stderr` ausgegeben.

Ich sehe hier ürbigens keinen Grund ``shell=True`` zu verwenden.

Re: kleines Problem mit subprocess?!

Verfasst: Sonntag 21. Mai 2017, 17:42
von wese
Hi,

ohne shell=true kommen fehler und beim auslesen der errors kommt None zurück

pi@raspberrypi:~ $ sudo ./create_network_directory.py
Retrying with upper case share name
mount error(6): No such device or address
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
None

Re: kleines Problem mit subprocess?!

Verfasst: Sonntag 21. Mai 2017, 17:50
von BlackJack
@wese: Dann hast Du halt irgend etwas falsch gemacht, oder Du verschweigst etwas was tatsächlich eine Shell erfordern würde. Beim gezeigten Code sehe ich da nichts.

Re: kleines Problem mit subprocess?!

Verfasst: Sonntag 21. Mai 2017, 21:50
von Sirius3
@wese: wenn man testen will, ob ein Programm fehlerfrei ausgeführt wurde, gibt es den Exitcode, der mit check_call, bzw. check_output geprüft wird.

Code: Alles auswählen

mount_cmd = ['mount', '-t', 'cifs', '//xxx.xxx.xxx.xxx/test', '/mnt/windowsordner1', '-o', 'username=xxxx,password=xxx']
subprocess.check_call(mount_cmd)

Re: kleines Problem mit subprocess?!

Verfasst: Montag 22. Mai 2017, 21:19
von wese
Hi,

also die Shell braucht es nicht wenn die Befehle und Argumente einzeln aufgelistet werden,
das funktioniert dann mit diesem Code :wink: , aber das eigentliche Problem beseitigt es leider nicht
der return code ist None und stdout ist leer obwohl ja in der Textconsole mount error(6) aufgelistet wird.
Die Frage ist nun wieso steht diese Info nicht in stdout?

Code: Alles auswählen

import subprocess

cmd = ['mount', '-t', 'cifs', '//xxx.xxx.xxx.xxx/test', '/mnt/windowsordner1', '-o', 'username=xxxx,password=xxxx']

pro = subprocess.Popen(cmd, stdout=subprocess.PIPE)
print(pro.returncode)
print(pro.stdout.read())
pi@raspberrypi:~ $ sudo python3 test_network_3.py
None
Retrying with upper case share name
mount error(6): No such device or address
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
b''

Re: kleines Problem mit subprocess?!

Verfasst: Montag 22. Mai 2017, 21:35
von BlackJack
@wese: Der Rückgabewert ist `None` wenn das Programm noch nicht zuende gelaufen ist. Und warum die Ausgabe nicht in `stdout` steht, habe ich ja bereits geschrieben.