Ich zerreiße mein Gehirn hier zu versuchen, eine einfache Funktion mit Python ohne Shell = True und bekomme nicht die Ergebnisse, die ich brauche. Ich benutze Python 2.7 unter Linux.Python Unterprozess Hilfe - Kann nicht Shell = true
Ich habe mehrere Methoden ausprobiert, dies zu tun. Es funktioniert gut, wenn ich Shell verwenden = true etwa so:
import subprocess as s
var1 = s.call("echo $HOME", shell=True)
und
import subprocess as s
var1 = s.check_output("echo $HOME", shell=True)
beide
/home/myhost
zurückkehren ..., wie es sollte, aber alles andere habe ich versucht, scheitert . In den meisten Fällen scheint es, dass es meine Variable als String statt als Befehl übergibt.
Dies sind die Ergebnisse, die ich mit den verschiedenen Methoden erhalten haben:
import subprocess as s
print var1
kehrt
[email protected]:~/Desktop$ python home_test.py
File "home_test.py", line 42, in <module>
main()
File "home_test.py", line 11, in main
my_test()
File "home_test.py", line 16, in check_auth
var1 = s.check_output("echo $HOME")
File "/usr/lib/python2.7/subprocess.py", line 567, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Dann habe ich versucht, dies:
import subprocess as s
var1 = s.Popen(['echo', '$HOME'], stdout=s.PIPE)
print var1
kehrt
[email protected]:~/Desktop$ python home_test.py
<subprocess.Popen object at 0x7f297ebcbf90>
[email protected]:~/Desktop$echo: write error: Broken pipe
Dann folgt aus:
import subprocess as s
cmd1 = '$HOME'
var1 = s.Popen(['/bin/echo', cmd1], stdout=s.PIPE)
print var1
kehrt
('$Home\n', None)
und diese
import subprocess as s
cmd1 = 'HOME'
var1 = s.Popen(['/bin/echo', cmd1], stdout=s.PIPE)
print var1
kehrt
[email protected]:~/Desktop$ python home_test.py
('Home\n', None)
einige doc, dass sagte, os zu benutzen ... was auch fehlschlug, was nicht überraschend ist, nachdem herausgefunden wurde, dass dies in 2.6 veraltet war.
import os
var1 = os.popen('echo $HOME')
print var1
kehrt
<open file 'echo $HOME', mode 'r' at 0x7f1c6b26f6f0>
sh: echo: I/O error
Dann ist mein letzter Versuch (eigentlich waren es mehr ... aber wir werden es nur auf diese verlassen)
import subprocess as s
var1= s.Popen(["echo", "$HOME"], stdout=s.PIPE).communicate()[0]
print var1
kehrt:
[email protected]:~/Desktop$ python home_test.py
$HOME
Kann jemand bitte zeigen m in die richtige Richtung? Ich habe einen ganzen Tag damit verbracht, damit zu spielen und brauche bitte Hilfe. Vielen Dank im Voraus für jegliche Hilfe.
In 'var1 = s.Popen (['echo', '$ HOME'], stdout = s.PIPE)' wird nur das erste Array-Element als Skript behandelt. Nachfolgende Array-Elemente sind Argumente für dieses Skript. –
... übrigens, was ist dein wirklicher Anwendungsfall? Im Allgemeinen ist die Verwendung von 'shell = True' die falsche Sache; Es führt Sicherheits-Bugs ein, wenn es nicht mit ausreichender (wesentlicher!) Vorsicht verwendet wird, und tut nichts, was Sie nicht tun können, indem Sie Ihren Python ausführlicher machen. –