python——外部執行命令subprocess

1、subprocess . run()方法

subprocess . run()方法は公式推薦の方法では、ほとんどすべての仕事はそれで完成できる。
次は関数ソース。

subprocess.run(args,
 *,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
ced=None,
timeout=None,
check=False,
enccoding=None,
error=None)

2 .使用リスト執行方式

個人方法2悪い感じで、特に管の记号の使用は、たいは、

#!/bin/env python3
import subprocess
b = subprocess.run(["ls", "-l", "/ltp"])
print(b)
print(b.args)
print(b.returncode)

執行の结果

[root@localhost python]# ./2.py
total 10865
-rw-r--r--. 1 root root     10865 May  8 16:21 123.txt
CompletedProcess(args=['ls', '-l', '/ltp'], returncode=0)
['ls', '-l', '/ltp']
0

4 .検査の異常

例1:アナログrenturncode値はゼロではない

  • パラメータチェックに伝わった= true、値がない時に戻ると、売りの異常になる
[root@localhost python]# cat 1.py
#!/bin/env python3
import subprocess
b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
print(b.returncode)

執行の結果、calledprocesserrorタイプに戻った伞

[root@localhost python]# ./1.py
ls: cannot access /123: No such file or directory
Traceback (most recent call last):
  File "./1.py", line 3, in <module>
    b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 487, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'ls -l /123 | head -2 && exit 1' returned non-zero exit status 1.
# 返回了 CalledProcessError 类型报错

例2:アナログ執行ターンオーバー

  • timeoutexpired異常に戻る
[root@localhost python]# vim 1.py
#!/bin/env python3
import subprocess

b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)

print(b.returncode)

結果が

[root@localhost python]# ./1.py
Traceback (most recent call last):
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 474, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 939, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 1682, in _communicate
    self._check_timeout(endtime, orig_timeout)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 982, in _check_timeout
    raise TimeoutExpired(self.args, orig_timeout)
subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./1.py", line 3, in <module>
    b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)
  File "/usr/local/python3/lib/python3.7/subprocess.py", line 479, in run
    stderr=stderr)
subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds

1 .初歩の認識popen类

まずpopen類の构造の関数でみて

class Popen(
    args,
    bufsize=0,
    executable=None,
    stdin=None,
    stdout=None,
    stderr=None,
    preexec_fn=None,
    close_fds=False,
    shell=False,
    cwd=None,
    env=None,
    universal_newlines=False,
    startupinfo=None,
    creationflags=0
):
パラメータ つづりや一覧
bufsize 1:無緩衝
1:行緩衝
他正数値は緩衝地帯の大きさ
敗数値は采を黙認するシステムの緩衝(普通は全緩衝)
executable 一般不用argsつづり、または一覧の1項は手続きの人
stdin
stdout
stderr
: none何ら継承重配向父プロセス
創設pipe:管
文書の対象
ファイル描写符(整数)
stderrも設置をstdout
preexec_fn とりあげ関数、フォークとexec執行
close_fds unixで執行新入程前閉鎖か0/1分の1 / 2以外のファイル
windowsでは相続しない父のプロセスのファイルを描いて
shell trueをすれば、
unixの下では、args前を加えて「/ bin / bash」「- c "
windowsで、相当に添加した" cmd . / c exe」
cwd 設置作業をリスト
env 設置環境変数
unviersal_newlines 各種の先頭符統一処理成" \ n
startupinfo windowsの下に伝えるcreateprocessの構造体
creationflags 自分の官制所の窓口windowsでリレーcreate_new_console創建

2、外部osモジュール執行命令を付け加えた

用法2、os . popen ()

とsubprocess . popen()に似て、が書いた

答案:subprocess . run()とsubprocess . popen()の執行の結果には书き込みのキャッシュ

ソースネットワーク 戻る