添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

PythonのSubprocessでBashのパイプを利用したコマンドを実行したい場合、いくつかの方法があるようだ。

1. subprocess.PIPEを利用する

subprocessでは、コマンド実行時にsubprocess.PIPEを使ってstdoutやstderrを変数に代入することができる。 さらにstdinを変数から取得させることができるので、これを利用して出力結果を渡してやればよい。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex
command1 = 'ls /'
command2 = 'sed s/opt/aaa/g'
process1=subprocess.Popen(shlex.split(command1),stdout=subprocess.PIPE)
process2=subprocess.Popen(shlex.split(command2),stdin=process1.stdout)
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess,shlex
command1 = 'ls /'
command2 = 'sed s/opt/aaa/g'
process1=subprocess.Popen(shlex.split(command1),stdout=subprocess.PIPE)
process2=subprocess.Popen(shlex.split(command2),stdin=process1.stdout)
[root@BS-PUB-CENT7-01 ~]# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@BS-PUB-CENT7-01 ~]# /tmp/test.py
lib64
media

2. subprocess.callやPopenでshell=Trueをする

より簡単に記述したい場合は、以下のようにコマンド実行時に「shell=True」を指定する。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
command = 'ls / | sed s/opt/aaa/g'
subprocess.call(command,shell=True)
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
command = 'ls / | sed s/opt/aaa/g'
subprocess.call(command,shell=True)
[root@BS-PUB-CENT7-01 ~]# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@BS-PUB-CENT7-01 ~]# /tmp/test.py
lib64
media
                                                

Python 3.9でasync使用時に『can't register atexit after shutdown』というエラーが出るようになった

release: 2021-03-24 update: 2021-03-20