Tuesday, September 13, 2022

How to execute a program or call a system command from Python

 Модуль подпроцесса — это рекомендуемый Python способ выполнения команд оболочки.Это дает нам возможность подавлять вывод команд оболочки или связывать входные и выходные данные различных команд вместе, в то же время предоставляя аналогичный os.system()  опыт для основных случаев использования.

(.env) boris@boris-All-Series:~/BayesClassifier$ cat cmdRunPython1.py

import subprocess

list_files = subprocess.run(["ls", "-CRl"])

print("The exit code was: %d" % list_files.returncode)

(.env) boris@boris-All-Series:~/BayesClassifier$ python3 cmdRunPython1.py

.:

total 64

-rw-rw-r-- 1 boris boris   733 сен 13 14:04 argMaximum.py

-rw-rw-r-- 1 boris boris   118 сен 13 19:34 cmdRunPython1.py

-rw-rw-r-- 1 boris boris   116 сен 13 19:36 cmdRunPython2.py

-rw-rw-r-- 1 boris boris   115 сен 13 19:41 cmdRunPython3.py

-rw-rw-r-- 1 boris boris   176 сен 13 19:25 cmdRunPython.py

drwxrwxr-x 2 boris boris  4096 сен 13 19:35 COPIES

-rw-rw-r-- 1 boris boris  2874 сен 13 12:00 GaussProcessRegr.py

-rwxrwxr-x 1 boris boris 16520 сен 13 19:43 hello

-rw-rw-r-- 1 boris boris   111 сен 13 19:43 hello.cpp

-rw-rw-r-- 1 boris boris  6123 сен 13 15:46 OptimalBayes1.py

-rw-rw-r-- 1 boris boris  3026 сен 13 12:20 OptimalBayes.py

./COPIES:

total 32

-rw-rw-r-- 1 boris boris  733 сен 13 19:35 argMaximum.py

-rw-rw-r-- 1 boris boris  118 сен 13 19:35 cmdRunPython1.py

-rw-rw-r-- 1 boris boris  110 сен 13 19:35 cmdRunPython2.py

-rw-rw-r-- 1 boris boris  176 сен 13 19:35 cmdRunPython.py

-rw-rw-r-- 1 boris boris 2874 сен 13 19:35 GaussProcessRegr.py

-rw-rw-r-- 1 boris boris 6123 сен 13 19:35 OptimalBayes1.py

-rw-rw-r-- 1 boris boris 3026 сен 13 19:35 OptimalBayes.py

The exit code was: 0

В первой строке мы импортируем модуль подпроцесса, который является частью стандартной библиотеки Python. Затем мы используем функцию subprocess.run() для выполнения команды. Как и os.system(), команда subprocess.run() возвращает код завершения того, что было выполнено.В отличие от os.system(), обратите внимание, что subprocess.run() требует в качестве входных данных список строк, а не одну строку. Первым элементом списка является имя команды. Остальные элементы списка — это флаги и аргументы команды.

Несколько других примеров

(.env) boris@boris-All-Series:~/BayesClassifier$ cat cmdRunPython2.py

import subprocess

list_files = subprocess.run(["df","-Th"])

print("The exit code was: %d" % list_files.returncode)

(.env) boris@boris-All-Series:~/BayesClassifier$ python3 cmdRunPython2.py

Filesystem     Type   Size  Used Avail Use% Mounted on

tmpfs          tmpfs  3,2G  2,2M  3,2G   1% /run

/dev/sda5      ext4   183G  118G   56G  68% /

tmpfs          tmpfs   16G  297M   16G   2% /dev/shm

tmpfs          tmpfs  5,0M  4,0K  5,0M   1% /run/lock

/dev/sda3      ext4   1,4G  174M  1,1G  14% /boot

tmpfs          tmpfs   16G     0   16G   0% /run/qemu

tmpfs          tmpfs  3,2G  124K  3,2G   1% /run/user/1000

The exit code was: 0

(.env) boris@boris-All-Series:~/BayesClassifier$ cat hello.cpp

#include <iostream>

int main()

{

   std::cout << "Running binary code via Python" << std::endl;

   return 0;

}

(.env) boris@boris-All-Series:~/BayesClassifier$ g++ -o hello  hello.cpp

(.env) boris@boris-All-Series:~/BayesClassifier$ cat cmdRunPython3.py

import subprocess

list_files = subprocess.run(["./hello"])

print("The exit code was: %d" % list_files.returncode)

(.env) boris@boris-All-Series:~/BayesClassifier$ cat cmdRunPython3.py

import subprocess

list_files = subprocess.run(["./hello"])

print("The exit code was: %d" % list_files.returncode)

(.env) boris@boris-All-Series:~/BayesClassifier$ python3 cmdRunPython3.py

Running binary code via Python

The exit code was: 0






























Чтобы управлять вводом и выводом с помощью subprocess.Popen, нам нужно использовать метод Communicate(). В новый файл с именем cat_Popen.py добавьте следующий фрагмент кода:

(.env) boris@boris-All-Series:~/BayesClassifier$ cat cat_Popen.py

import subprocess
useless_cat_call = subprocess.Popen(["cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
output, errors = useless_cat_call.communicate(input="Hello from the other side!")
useless_cat_call.wait()
print(output)
print(errors)

(.env) boris@boris-All-Series:~/BayesClassifier$ python3 cat_Popen.py
Hello from the other side!


No comments:

Post a Comment