We often need to execute a system command or script through Python, the system's shell command is independent of your Python process, each execution of a command, is to initiate a new process, Modules that call system commands or scripts through Python have os.system in Python2,
In [3]: Os.system ('uname-a'#127-ubuntu SMP Mon Dec 12:16:42 UTC x86_64 x86_64 x86_64 gnu/linuxout[3]: 0 # command execution succeeded
What is the implementation principle of this command? (In the video, explain the problem of inter-process communication ...)
In addition to Os.system can call system commands,, COMMANDS,POPEN2, etc. can also, relatively disorderly, so the official launch of the subprocess, the goal is to provide a unified module to implement the system command or script calls
The Subprocess module allows-spawn new processes, connect to their input/output/error pipes, and obtain their retur N Codes. This module intends to replace several older modules and functions:
The recommended approach to invoking subprocesses are to use the run () function for all use cases it can handle. For cases, the underlying Popen interface can used directly.
The run () function is added in Python 3.5; If you need to retain compatibility with older versions, see the older high-level API section.
Three ways to execute commands
Subprocess.run (*popenargs, Input=none, Timeout=none, Check=false, **kwargs) #官方推荐
Subprocess.call (*popenargs, Timeout=none, **kwargs) #跟上面实现的内容差不多, another way of writing
Subprocess. Popen () #上面各种方法的底层封装
Run () method
Run command with arguments and return a completedprocess instance. The returned instance would have attributes args, ReturnCode, stdout and stderr. By default, stdout and stderr is not captured, and those attributes would be None. Pass stdout=pipe and/or stderr=pipe in order to capture them.
If check is True and the exit code was Non-zero, it raises a calledprocesserror. The Calledprocesserror object'll has the return code in the ReturnCode attribute, and output & stderr attributes if Those streams were captured.
If timeout is given, and the process takes too long, a timeoutexpired exception would be raised.
The other arguments is the same as for the Popen constructor.
Standard notation
In [5]:ImportSubprocessin [6]: Subprocess.run (['DF','- H'],stderr=subprocess. Pipe,stdout=subprocess. pipe,check=True) out[6]: completedprocess (args=['DF','- H'], returncode=0, stdout=b'Filesystem Size used Avail use% mounted on\nudev 5.9G 0 5.9G 0%/DEV\NTMPFS 1.2G 5 0M 1.2G 5%/run\n/dev/sda1 447G 157G 268G 37%/\ntmpfs 5.9G 136M 5.8G 3%/DEV/SHM\NTMPFS 5.0M 4.0K 5.0M 1%/run/lock\ntmpfs 5.9G 0 5.9G 0%/sys/fs/cgroup\n/dev/loop3 84M 84M 0 100%/snap/core/3748\n/dev/loop0 315M 315M 0 100%/snap/pycharm-professional/46\n/dev/loop2 315M 315M 0 100%/snap/pycharm-professional/45\n/dev/loop1 84M 84M 0 100%/snap/core/3604\ncgmfs 100K 0 100K 0%/run/cgmanager/fs\ntmpfs 1.2G 108K 1.2G 1%/run/user/1000\n/dev/loop4 315M 315M 0 100%/ SNAP/PYCHARM-PROFESSIONAL/47\N/DEV/LOOP5 82M 82M 0 100%/snap/core/3887\ntmpfs 1.2G 0 1.2G 0% /run/user/1001\n', stderr=b"')
The command that involves piping | must be written like this
In [7]: Subprocess.run ('df-h|grep disk1'#shell=true means that this command is given directly to the system to execute, No python is required to parse Out[7]: completedprocess (args='df-h|grep disk1', returncode=1)
Call () method
#executes the command, returns the command execution status, 0 or not 0>>> retcode = Subprocess.call (["ls","- L"])#executes the command, returns normally if the command result is 0, or throws an exception>>> Subprocess.check_call (["ls","- L"]) 0#receives a string format command, returns a tuple form, the 1th element is the execution state, and the 2nd is the command result>>> Subprocess.getstatusoutput ('Ls/bin/ls') (0,'/bin/ls')#receives a string format command and returns the result>>> Subprocess.getoutput ('Ls/bin/ls')'/bin/ls'#executes the command and returns the result, noting that the result is returned, not printed, and the following example returns to Res>>> Res=subprocess.check_output (['ls','- L'])>>>Resb'Total 0\ndrwxr-xr-x-Alex Staff 408 2 11:05 oldboycrm\n'
Popen () method
Common parameters:
- The Args:shell command, which can be a string or sequence type (for example: list, tuple)
- stdin, stdout, stderr: Indicates the standard input, output, and error handles of the program, respectively
- PREEXEC_FN: Valid only on UNIX platforms, specifying an executable object (callable object) that will be called before the child process is run
- Shell: Ibid.
- CWD: Used to set the current directory of child processes
- ENV: The environment variable used to specify the child process. If env = None, the environment variables of the child process are inherited from the parent process.
What is the difference between the following 2 statements execution?
A=subprocess.run ('sleep', shell=true,stdout=subprocess. PIPE) a=subprocess. Popen ('sleep', shell=true,stdout=subprocess. PIPE)
The difference is that Popen will return immediately after the command is launched, without waiting for the command to execute the result. What are the benefits of this?
If you call the command or script need to execute 10 minutes, your main program does not need to wait here for 10 minutes, you can continue to go down, do other things, every once in a while, through a method to detect whether the command is completed.
The Popen call returns an object that can be used to get command execution results or state, and the object has the following methods
poll()
Check If child process has terminated. Returns ReturnCode
wait()
Wait for the child process to terminate. Returns ReturnCode attribute.
terminate()
Terminates the process started terminate the processes with SIGTERM
kill()
Kill the process that was started kill the procedure with SIGKILL
communicate()
Interacts with the initiated process, sends data to STDIN, receives output from stdout, and waits for the task to end
>>> a = subprocess. Popen ('python3 guess_age.py', stdout=subprocess. Pipe,stderr=subprocess. Pipe,stdin=subprocess. Pipe,shell=True)>>> a.communicate (b') ( B ') Your guess:try bigger\n', b')
send_signal(signal.xxx)
Send System signal
pid
Get the process number of the startup process
Python Basics-4.13 subprocess Module