Home  >  Article  >  Backend Development  >  Subprocess executes linux commands in batches in python

Subprocess executes linux commands in batches in python

不言
不言Original
2018-04-27 11:55:433269browse

This article explains in detail how to use subprocess to execute Linux commands in batches in python. Friends who are interested can refer to it.

The relevant modules and functions that can execute shell commands are:

  • os.system

  • os.spawn

  • os.popen --Abandoned

  • popen --Abandoned

  • commands --Abandoned, 3. Removed from

subprocess

call

##Execute the command and return the status code

>>> import subprocess
>>> ret = subprocess.call(["ls", "-l"], shell=False)
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
>>> ret = subprocess.call("ls -l", shell=True)
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
>>> print(ret)
0

check_call

Execute the command, if the execution status code is 0, return 0, otherwise an exception will be thrown

>>> subprocess.check_call(["ls", "-l"])
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
0
>>> subprocess.check_call("exit 1", shell=True)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 581, in check_call
  raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command &#39;exit 1&#39; returned non-zero exit status 1

check_output

Execute the command, if the status code is 0, return the execution result, otherwise throw an exception

>>> subprocess.check_output(["echo", "Hello World!"])
b&#39;Hello World!\n&#39;
>>> subprocess.check_output("exit 1", shell=True)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 626, in check_output
  **kwargs).stdout
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 708, in run
  output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command &#39;exit 1&#39; returned non-zero exit status 1

##subprocess.Popen(...)

Used to execute complex system commands

Parameters:

args: shell command, can be a string or sequence type (such as: list, tuple)


bufsize: Specify the buffer. 0 no buffering, 1 line buffering, other buffer sizes, negative system buffering

stdin, stdout, stderr: represent the standard input, output, and error handles of the program respectively

preexec_fn: Only valid under Unix platform, used to specify a executable object (callable object), which will be called before the child process runs

close_sfs: Under Windows platform, if close_fds If set to True, the newly created child process will not inherit the input, output, and error pipes of the parent process.

So you cannot set close_fds to True and redirect the standard input, output and error (stdin, stdout, stderr) of the child process at the same time.

shell: Same as above

cwd: used to set the current directory of the child process

env: used to specify the environment variable of the child process . If env = None, the child process's environment variables will be inherited from the parent process.

universal_newlines: Different systems have different line breaks, True -> Agree to use n

startupinfo and createionflags are only valid under windows

Will be passed to the underlying CreateProcess() function to set some properties of the child process, such as: the appearance of the main window, the priority of the process, etc.

Execute ordinary commands


>>> import subprocess
>>> ret1 = subprocess.Popen(["mkdir","t1"])
>>> ret2 = subprocess.Popen("mkdir t2", shell=True)
>>> print(ret1)
<subprocess.Popen object at 0x7f4d7609dd30>
>>> print(ret2)
<subprocess.Popen object at 0x7f4d7609dc18>

There are two types of commands entered in the terminal:

Enter to get the output, such as: ifconfig

    Enter a certain environment, depend on it and then enter it, such as: python
  • >>> import subprocess
    >>> obj = subprocess.Popen("mkdir t3", shell=True, cwd=&#39;/tmp/&#39;,)
    >>> import subprocess
    >>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    >>> obj.stdin.write("print(1)\n")
    9
    >>> obj.stdin.write("print(2)")
    8
    >>> obj.stdin.close()
    >>> cmd_out = obj.stdout.read()
    >>> obj.stdout.close()
    >>> cmd_error = obj.stderr.read()
    >>> obj.stderr.close()
    >>> print(cmd_out)
    1
    2
    >>> print(cmd_error)

>>> import subprocess
>>> 
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> obj.stdin.write("print(1)\n")
9
>>> obj.stdin.write("print(2)")
8
>>> 
>>> out_error_list = obj.communicate()
>>> print(out_error_list)
(&#39;1\n2\n&#39;, &#39;&#39;)

>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> out_error_list = obj.communicate(&#39;print("hello")&#39;)
>>> print(out_error_list)
(&#39;hello\n&#39;, &#39;&#39;)

Related recommendations:

Use python to execute shell scripts and dynamically transfer parameters and basic use of subprocess

Introduction and use of the subprocess module

Detailed introduction to the Python standard library subprocess subprocess package

The above is the detailed content of Subprocess executes linux commands in batches in python. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn