Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

subprocessでホームディレクトリの省略記法'~'を使うときはshellオプションをTrueにする

Pythonでshellを使えるsubprocessは何かと便利ですが

実際のところ

単にホームディレクトリを見るだけの場合、チルダを使って楽したいところですが……素のsubprocessだとエラーになります。

subprocess.run(["ls", '~/'])
#>> ls: cannot access '~/': No such file or directory

この対策として、shellオプションをTrueにしてあげればよいです。

 subprocess.run(["ls", '~/'], shell=True)
#>> . .. foo bar ...

あるいは、こういう風に内部の実行ファイルを仲介することも可能です。

cmd = "~/foo/bar/exe"
subprocess.call(cmd,shell=True)

python内で代替がある挙動なら、そちらを極力使いましょう……という話。

shell が True なら、指定されたコマンドはシェルによって実行されます。
あなたが Python を主として (ほとんどのシステムシェル以上の) 強化された制御フローのために使用していて、
さらにシェルパイプ、ファイル名ワイルドカード、環境変数展開、~ のユーザーホームディレクトリへの展開のような
他のシェル機能への簡単なアクセスを望むなら、これは有用かもしれません。
<<

ただし、同じ文章内に以下のような記述もあるため、Pythonで組み込まれた値があるのであれば、極力使ってあげたよいかと思われます。
>>
しかしながら、Python 自身が多くのシェル的な機能の実装を提供していることに注意してください (特に glob, fnmatch, os.walk(), os.path.expandvars(), os.path.expanduser(), shutil)。
<<

* 参考もと