オライリー発行の「入門Python3」P.314に記載されていることで,なぜそうなるのか分からないことがあったので質問させていただきます.
###質問内容
subprocessにおいて,引数を二つとるプログラムは二通りの方法で実行できると書いてあり.
- 一個の文字列ですべてを指定する方法
ex) ret = subprocess.call('date -u', shell=True)
- 引数のリストを作る
ex) ret = subprocess.call(['date', '-u'])
ここで2の方法ではシェルを呼び出さなくてもよいそうなのですが,その理由はなんでしょうか.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/19 07:18
回答3件
0
正確には、
- 誤:2の方法ではシェルを呼び出さなくてもよい
- 正:2の方法ではシェルを呼び出していない
です。「シェルを呼び出さなくてもよい」「シェルを呼び出さなければならない」の話ではなく、「シェルを呼び出さない」「シェルを呼び出す」という話です。
投稿2021/03/17 07:48
総合スコア6142
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/19 07:15
2021/03/19 07:20
2021/03/19 07:24
2021/03/19 07:40
2021/03/22 06:18
0
質問の件は、linuxなどのOSの場合で、Windowsでは成り立っていません。
それはsubporcessを実行するために使うOSの機能が違うためです。
python
1>>> subprocess.call(['date', '-u'], shell=True) 2入力された日付は受け付けられません。 3新しい日付を入力してください: (年-月-日) 40 5>>> subprocess.call(['date', '-u']) 6Traceback (most recent call last): 7 File "<stdin>", line 1, in <module> 8 File "C:\Users\shinp\anaconda3\lib\subprocess.py", line 340, in call 9 with Popen(*popenargs, **kwargs) as p: 10 File "C:\Users\shinp\anaconda3\lib\subprocess.py", line 854, in __init__ 11 self._execute_child(args, executable, preexec_fn, close_fds, 12 File "C:\Users\shinp\anaconda3\lib\subprocess.py", line 1307, in _execute_child 13 hp, ht, pid, tid = _winapi.CreateProcess(executable, args, 14FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
linuxなどで一個の文字列ですべてを指定する方法でシェルが必要なのは、excevなどに渡す引き数列への分解が難しいからだと書かれています。
特に、オプションを持つ引数の分解が難しいそうです。
「クォーティングやバックスラッシュエスケープが必要なものは単一のリスト要素であること」でした。
投稿2021/03/17 08:09
編集2021/03/17 08:19総合スコア24670
0
ベストアンサー
詳しくはマニュアルを見ていただくのがいいと思います。
簡単に説明します。
subprocess.call() は ['date', '-u'] が渡されると、「date」コマンドに引数 「-u」を渡して実行します。 このとき、どこがコマンドでどれが引数かは、リストの先頭かそれ以外かで判定します。
'date -u' を渡された場合、コマンド名と引数を解釈して分離して実行しなければなりません。 それは、UNIXなのかWindowsなのか、システムによって異なる場合が多いでしょう。
このようにシステム毎に異なるコマンドラインの解釈をシステムのshellに任せるのが shellオプションです。
shellを使えば、'ls *.jpg' のようにワイルドカードなどの展開もしてくれます。
ただし、shellオプションは、セキュリティに問題があるということなので、注意書きをよく読んで理解してから使うのがいいでしょう。
投稿2021/03/17 07:28
総合スコア13773
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。