私はここで私の脳を壊して、shell = trueを使わずにPythonで単純な関数を実行しようとしています。私はLinux上でPython 2.7を使用しています。Pythonのサブプロセスヘルプ - shell = trueを使用できない
私はこれを行うために複数の方法を試しました。
import subprocess as s
var1 = s.call("echo $HOME", shell=True)
と
import subprocess as s
var1 = s.check_output("echo $HOME", shell=True)
両方はそれが必要のような...
/home/myhost
を返すが、私が試した他のすべてが失敗します。私はそうのようなシェル= trueを使用している場合は正常に動作します。ほとんどの場合、コマンドの代わりに変数を文字列として渡しているようです。
import subprocess as s
var1 = s.Popen(['echo', '$HOME'], stdout=s.PIPE)
print var1
戻り
[email protected]:~/Desktop$ python home_test.py
<subprocess.Popen object at 0x7f297ebcbf90>
[email protected]:~/Desktop$echo: write error: Broken pipe
:私はこれを試み
[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
import subprocess as s
print var1
戻り値:
これらは私が様々な方法で受信された結果であります
次に、この:
import subprocess as s
cmd1 = '$HOME'
var1 = s.Popen(['/bin/echo', cmd1], stdout=s.PIPE)
print var1
戻り
('$Home\n', None)
と
[email protected]:~/Desktop$ python home_test.py
('Home\n', None)
は、いくつかのドキュメントが見つかっこの
import subprocess as s
cmd1 = 'HOME'
var1 = s.Popen(['/bin/echo', cmd1], stdout=s.PIPE)
print var1
リターンこれもまた失敗しました。これを見つけたのは驚くことではありませんが、これは2.6で廃止されました。その後
import os
var1 = os.popen('echo $HOME')
print var1
戻り
<open file 'echo $HOME', mode 'r' at 0x7f1c6b26f6f0>
sh: echo: I/O error
私の最後の試み(実際にはそれ以上は...あったが、我々はちょうどこの時にそれを残します)
import subprocess as s
var1= s.Popen(["echo", "$HOME"], stdout=s.PIPE).communicate()[0]
print var1
リターン:
[email protected]:~/Desktop$ python home_test.py
$HOME
誰かが指摘できますか?右の方向に?私はこれで一日を過ごしました。私は助けてください。ご協力いただきありがとうございます。
'var1 = s.Popen(['echo'、 '$ HOME']、stdout = s.PIPE)'では、最初の配列要素だけがスクリプトとして扱われます。後続の配列要素は、そのスクリプトへの引数です。 –
... btw、本当のユースケースは何ですか?一般に、 'shell = True'を使うのは間違ったことです。十分な(実質的な!)注意を払って使用しないとセキュリティ上のバグが発生し、Pythonをより冗長にすることで何もできないことはありません。 –