kleines Problem mit subprocess?!

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
wese
User
Beiträge: 5
Registriert: Mittwoch 15. März 2017, 21:25

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)
BlackJack

@wese: Fehlermeldungen werden üblicherweise auf `stderr` ausgegeben.

Ich sehe hier ürbigens keinen Grund ``shell=True`` zu verwenden.
wese
User
Beiträge: 5
Registriert: Mittwoch 15. März 2017, 21:25

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
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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
wese
User
Beiträge: 5
Registriert: Mittwoch 15. März 2017, 21:25

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''
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.
Antworten