Maison  >  Article  >  développement back-end  >  Utiliser python3 pour implémenter les fonctions de script Linux

Utiliser python3 pour implémenter les fonctions de script Linux

anonymity
anonymityavant
2019-04-19 11:27:053941parcourir

Python 3 a été mis à jour depuis un certain temps. Par rapport à Python 2, il existe de nombreux changements différents. Python 3 est également largement utilisé ici, nous pratiquons principalement certaines commandes d'exécution de script Python 3 sous Linux.

Tout d'abord, si vous avez seulement besoin d'exécuter, ou si vous avez seulement besoin d'obtenir l'état d'exécution, vous pouvez utiliser os.system pour appeler le code ci-dessus

#!/usr/bin/env python3
print ('hello,world')
import os
val2 =  os.system('cd trb && cd trb')
val3 = os.system('ls')
print('val2 is ',val2)

. Si le code dans val2 est exécuté avec succès, c'est-à-dire qu'il y a deux niveaux de dossiers trb, la valeur de val2 est 0, sinon elle est 256

L'appel sur deux lignes n'a pas d'héritage Si vous le souhaitez. exécutez en continu, ajoutez && dans une seule instruction (syntaxe Shell)

Avant l'impression, l'écran affichera également le résultat de l'exécution

hello,worldsh: line 0: cd: trb: 没有那个文件或目录
Abcd.py  automesh.sh  Cal_Ori  fold.txt  Linux_py_temp.py  meshedjob.rec  new_geom  onc143314  trb
val2 is  256

méthode os.popen(cmd), vous ne pouvez obtenir le résultat de l'opération, mais si vous n'imprimez pas, il n'y aura rien à l'écran non plus.

Par exemple,

val4 = os.popen('cd trb && cd trb')
val5 = os.popen('ls')print('开始PRINT')print(val4.read())print(val5.read())

s'affiche comme suit

hello,world
开始PRINT/bin/sh: line 0: cd: trb: 没有那个文件或目录
Abcd.py
automesh.shCal_Ori
fold.txt
Linux_py_temp.py
meshedjob.rec
new_geom
onc143314
trb

La sortie ici est un objet de type fichier, qui peut également être parcouru en appelant read ou lire les lignes.

###########

L'arme ultime, le sous-processus

Le module sous-processus recommandé après py3.5

En ligne Le les commandes du didacticiel sont des fonctions en 2 et ont été supprimées en 3, mais elles peuvent être appelées via un sous-processus

a les commandes suivantes :

subprocess.getstatusoutput (<.> cmd )

revient à exécuter

cmd dans le shell. (status, <span class="pre">(status, <span class="pre">output) 返回2个元素的元组</span></span>output) renvoie un tuple de 2 éléments

3.4 Puis ajouter le support Win

subprocess.getoutput (cmd )

legacycmd = subprocess.getstatusoutput('ls -l')print('subprocess.getstatusoutput 输出',legacycmd)
legacycmd2 = subprocess.getoutput('ls -l')print('subprocess.getoutput 输出',legacycmd2)
Exécuter cmd et renvoyer le résultat

Ce ci-dessus est le code

subprocess.getstatusoutput 输出 (0, &#39;总用量 48\n-rwxr--r-- 1 para036 bjpara  516 4月  16 2018 Abcd.py\n-rwxr--r-- 1 para036 bjpara 1619 4月  16 16:58                     automesh_onpsn_fortest.sh\n-rwxr--r-- 1 para036 bjpara 1616 4月  15 14:31 automesh.sh\ndrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:31 Cal_Ori\n-rw-r                    --r-- 1 para036 bjpara   32 4月  16 16:56 fold.txt\n-rwxr--r-- 1 para036 bjpara 1530 4月  15 14:45 Linux_py_temp.py\n-rw-r--r-- 1 para036 bjpara   27                     4月  15 14:43 meshedjob.rec\ndrwxr-xr-x 2 para036 bjpara 4096 4月  15 14:31 new_geom\ndrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:51 onc143314\ndrwx                    r-xr-x 5 para036 bjpara 4096 4月  16 17:05 onc16165650\ndrwxr-xr-x 5 para036 bjpara 4096 4月  16 16:46 onc163840\ndrwxr-xr-x 2 para036 bjpara 4096 4                    月  15 14:32 trb&#39;)
subprocess.getoutput 输出 总用量 48
-rwxr--r-- 1 para036 bjpara  516 4月  16 2018 Abcd.py
-rwxr--r-- 1 para036 bjpara 1619 4月  16 16:58 automesh_onpsn_fortest.sh
-rwxr--r-- 1 para036 bjpara 1616 4月  15 14:31 automesh.sh
drwxr-xr-x 5 para036 bjpara 4096 4月  15 14:31 Cal_Ori
-rw-r--r-- 1 para036 bjpara   32 4月  16 16:56 fold.txt
-rwxr--r-- 1 para036 bjpara 1530 4月  15 14:45 Linux_py_temp.py
-rw-r--r-- 1 para036 bjpara   27 4月  15 14:43 meshedjob.rec
drwxr-xr-x 2 para036 bjpara 4096 4月  15 14:31 new_geom
drwxr-xr-x 5 para036 bjpara 4096 4月  15 14:51 onc143314
drwxr-xr-x 5 para036 bjpara 4096 4月  16 17:05 onc16165650
drwxr-xr-x 5 para036 bjpara 4096 4月  16 16:46 onc163840
drwxr-xr-x 2 para036 bjpara 4096 4月  15 14:32 trb
sortie :

Où la sortie est une chaîne. S'il n'est pas imprimé, il ne sera pas affiché

La nouvelle version recommande d'utiliser subprocess.run() pour résoudre les problèmes généraux.

subprocess.run(), subprocess.call(), subprocess.check_call() et subprocess.check_output() sont toutes des fonctions de haut niveau implémentées en encapsulant subprocess.Popen, donc si nous avons besoin d'une fonction plus complexe, il peut être complété via subprocess.Popen

recomd = subprocess.run(['ls','-l'])#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。print('输出recmd\n',recomd)print(recomd.returncode)
Run ne renverra pas de sortie par défaut, mais renvoie uniquement la commande et l'état d'exécution

La sortie est la suivante :

Si vous souhaitez renvoyer une sortie, ajoutez des paramètres, transmettez subprocess.PIPE à stdout et stderr, puis vous pourrez transmettre les attributs stdout et stderr de l'instance de classe CompletedProcess renvoyée ou capturer le contenu correspondant ; universal_newlines :

Ce paramètre affecte le format des données d'entrée et de sortie. Par exemple, sa valeur par défaut est False. À ce stade, la sortie de stdout et stderr. est une séquence d'octets lorsque la valeur de ce paramètre Lorsqu'elle est définie sur True, la sortie vers stdout et stderr sont des chaînes.

#!/usr/bin/env python3
print (&#39;hello,world&#39;)
import os
# val2 =  os.system(&#39;cd trb && cd trb&#39;)
# val3 = os.system(&#39;ls&#39;)
# print(&#39;val2 is &#39;,val2)
# val4 = os.popen(&#39;cd trb && cd trb&#39;)
# val5 = os.popen(&#39;ls&#39;)
# print(&#39;开始PRINT&#39;)
# print(val4.read())
# print(val5.read())
import subprocess
recomd = subprocess.run([&#39;ls&#39;,&#39;-l&#39;])
#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。
print(&#39;输出recmd\n&#39;,recomd)
print(recomd.returncode)
print(&#39;传递参数&#39;)
recomdouterr = subprocess.run( [&#39;ls&#39;,&#39;-l&#39;],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)
print(&#39;输出outerr&#39;,recomdouterr.stdout,recomdouterr.stderr)
print(&#39;传递参数2&#39;)
recomdouterr = subprocess.run( [&#39;ls&#39;,&#39;-l&#39;],stdout=subprocess.PIPE,universal_newlines=True)
print(&#39;输出outerr&#39;,recomdouterr.stdout)
print(len( recomdouterr.stdout.strip().split(&#39;\n&#39;) ))
print(recomdouterr.stdout.strip().split(&#39;\n&#39;)[-1])
# legacycmd = subprocess.getstatusoutput(&#39;ls -l&#39;)
#
# print(&#39;subprocess.getstatusoutput 输出&#39;,legacycmd)
#
# legacycmd2 = subprocess.getoutput(&#39;ls -l&#39;)
#
# print(&#39;subprocess.getoutput 输出&#39;,legacycmd2)
Le code total est le suivant :

Référence : python3.5 Documentation officielle :

https://docs.python.org/3.5/library/subprocess.html

Python est utilisé de plus en plus largement, et Linux a également un grand potentiel en tant que serveur. L'utilisation de Python pour implémenter les opérations de script Linux simplifie les opérations côté serveur et améliore la contrôlabilité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer