[PYTHON] Avec moi, cp et sous-processus

J'étais un peu accro au sous-processus, alors j'ai pris une note.

Un traitement équivalent à cp -pr était requis lors de la création d'un script d'assistance pour le déploiement. L'implémentation cp (incomplète) écrite en Python est la suivante.

python_cp


def _copy(src, dst):
    if os.path.isfile(src):
        shutil.copy2(src, dst)
        return
    if os.path.isdir(src) and os.path.isdir(dst):
        target = os.path.join(dst, os.path.basename(src))
        # TODO Fix behavior like cp -pr (Si le répertoire cible existe, les fichiers qu'il contient/Le répertoire doit être conservé)
        if os.path.exists(target):
            shutil.rmtree(target)
        shutil.copytree(src, target)
        return
    if os.path.isdir(src) and os.path.isfile(dst):
        raise IOError(
            "(Src:directory/Dest:file) This combination isn't allowed")

Bien qu'il existe des restrictions (voir les commentaires), ce cas ne peut pas se produire dans cette application, donc c'est OK.

Cependant, comme d'habitude, j'ai entendu l'illusion que "Wow, l'ingénieur (rires) qui ne le fait pas même si je peux déplacer cp avec Subprocess ..." du côté, j'ai donc décidé d'écrire une implémentation qui utilise le subprocess. ..

subprocess_cp_error


def _copy(src, dst):
    subprocess.Popen(['cp', '-pr', src, dst]).communicate()

Cependant, avec cette implémentation, les caractères génériques ne peuvent pas être utilisés dans src. Pour interpréter le caractère générique, vous devez passer shell = True à Popen et exécuter la commande via le shell. http://docs.python.jp/2.7/library/subprocess.html#subprocess.Popen

subprocess_cp_error2


def _copy(src, dst):
    subprocess.Popen(['cp', '-pr', src, dst], shell=True).communicate()

Alors, j'ai pensé: "Est-ce fini?", Mais ce n'est pas le cas. Avec l'implémentation ci-dessus, la commande cp ne fonctionne pas du tout. Lorsque shell = True, la commande est exécutée via le shell comme décrit ci-dessus, mais elle équivaut à la commande suivante.

via_shell_error


/bin/sh -c 'cp' '-pr' (src) (dst)

À première vue, cela a l'air bien, mais dans ce cas -pr n'est pas considéré comme une option pour cp, et src et dst ne sont pas considérés comme des arguments pour cp. En d'autres termes, cp a été exécuté sans aucun argument, ce qui a entraîné une erreur. Pour être correct, vous devez le spécifier avec une chaîne de caractères comme suit

via_shell


/bin/sh -c 'cp -pr (src) (dst)'

Ainsi, pour exécuter le sous-processus correspondant, spécifiez la commande donnée à Popen sous la forme d'une chaîne de caractères au lieu d'un tableau.

subprocess_cp


def _copy(src, dst):
    subprocess.Popen('cp -pr {0} {1}'.format(src, dst), shell=True).communicate()

Conclusion

Ne devrait pas être shell = True si non nécessaire w Eh bien, en fait, cela provoque également une injection de shell, donc la référence de la bibliothèque indique également: "Lorsque vous utilisez une entrée externe, ne la définissez jamais sur True!" ...

Recommended Posts

Avec moi, cp et sous-processus
Avec moi, NER et Flair
Avec et sans WSGI
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Travailler avec le tkinter et la souris
Python et matériel - Utilisation de RS232C avec Python -
Super résolution avec SRGAN et ESRGAN
Group_by avec sqlalchemy et sum
python avec pyenv et venv
py, shebang, venv et moi
Fonctionne avec Python et R
Créer et renvoyer un fichier CSV CP932 pour Excel avec Chalice
Communiquez avec FX-5204PS avec Python et PyUSB
Visualisation interactive avec ipywidgets et Bokeh
Briller la vie avec Python et OpenCV
Fonctionnement de la souris et du clavier Python avec pyautogui
Tri avec un mélange de chiffres et de lettres
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Easy Slackbot avec Docker et Errbot
Segmentation d'image avec scikit-image et scikit-learn
Processus d'authentification avec gRPC et authentification Firebase
Grattage avec Python, Selenium et Chromedriver
Jouez avec la série Poancare et SymPy
HTTPS avec Django et Let's Encrypt
Segmentation et regroupement de photos avec DBSCAN
Grattage avec Python et belle soupe
Sauvegarde NAS avec php et rsync
Pour moi: notes sur l'infrastructure et le réseau
Encodage et décodage JSON avec python
Traitement de chemin avec take while et drop while
Authentification de base, authentification Digest avec Flask
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Comparez DCGAN et pix2pix avec Keras
Utilisation de sessions et de réflexions avec SQL Alchemy
Lire et écrire NetCDF avec Python
Introduisez errBot et travaillez avec Slack
Enregistrer et récupérer des fichiers avec Pepper
Async / await avec Kivy et tkinter
J'ai joué avec PyQt5 et Python3
Connectez-vous avec PycURL et recevez une réponse
Expérimenté avec unicode, décoder et encoder
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Exécution parallèle facile avec le sous-processus python
Coexistence de Python2 et 3 avec CircleCI (1.0)
Dessinez des figures avec OpenCV et PIL
Jeu Sugoroku et jeu d'addition avec Python
Télécharger et télécharger des images avec Falcon
Modulation et démodulation FM avec Python
Créer un environnement avec pyenv et pyenv-virtualenv