0
votes

Module de sous-processus Python Envoi de chemin d'envoi en chaîne

à partir d'un script Python 3, je vais zipper un dossier.

La commande que je voudrais normalement utiliser dans le terminal et fonctionne , est

zip -p p4ssw0rd

(- PI Utilisez pour le cryptage de mot de passe et le / * à la fin car je souhaite connecter le contenu du dossier, si je n'inclut pas cela, l'archive contient uniquement un dossier vide )

Ceci crée avec succès un Certainfolder.zip avec le contenu protégé par mot de passe correct à l'intérieur.

Quand j'exécute cette commande de mon script, j'utilise

subprocess.Call (['ZIP', '-P', 'P4SSW0RD', 'Certainfolder.zip', "Certainfeufs / *"])

Cela me donne une erreur de glissière (le même genre que je voudrais obtenir si j'ai écrit la commande directement dans le terminal, mais si j'ai orthographié le nom du dossier, par exemple ZIP -P P4SSW0RD Certainfolder.ZIP / code>)

L'avertissement dit:

Zip AVERTISSEMENT: Nom non correspondant: Certainfolder / *

De ma compréhension, il interprément en quelque sorte le / et la * dans le nom du nom du dossier, et pas comme moi essayant de naviguer dans le dossier ...

Des idées?


faire plus de choses déroutantes:

si le peu defolder existe déjà, alors

subprocess.Call (['ZIP', '-P', 'P4SSW0RD', 'Certainfolder.zip', "Certainfeufs / *"])

sera exécuté. Il dit qu'il met à jour le contenu du dossier, mais rien ne change vraiment aussi loin que je peux dire à l'archive elle-même. Toutefois, si je modifie le 'Certainfolder / *' à quelque chose d'autre comme 'Quelqueotherfolder / *' alors il jette à nouveau un nom non correspondant à une erreur.


0 commentaires

4 Réponses :


0
votes

C'est probablement parce que votre script est exécuté d'un emplacement différent. Essayez de passer le chemin absolu au lieu d'un chemin relatif. E.G.

subprocess.call(['zip', '-P', 'P4ssw0rd', '-j', 'somefolder.zip', '/full/path/to/somefolder/*'])


1 commentaires

Il dit toujours que le nom ne correspondait pas, apparemment maintenant, il interprément le tout comme nom de dossier.



1
votes

Si cela ne vous dérange pas d'utiliser quelque chose d'autre que le module de sous-processus, cela fonctionne:

os.popen("zip -P P4ssw0rd somefolder.zip somefolder/*")


4 commentaires

Cela n'a pas vraiment fonctionné. Il crée cependant des fichiers étranges, avec des noms étranges et apparemment vides.


@celae Que signifie exactement "bizarre"?


@ P.DMitry Quelque fichier qui a un nom de non-sens aléatoire. Aucune extension. Semble être vide


@celae bizarre. Pouvez-vous essayer d'utiliser os.system au lieu de os.popen et dites-moi s'il a le même comportement?



0
votes

Vous devriez probablement convertir manuellement glob * à la liste des fichiers xxx


0 commentaires

0
votes

Après une inspection supplémentaire, j'ai trouvé que OS.System () proposé par @Imrand, bien que cela fonctionne, il est recommandé d'être remplacé par le module SUPBROCESS . Donc, bien la manière la plus correcte serait d'utiliser sous-processus.Call () , mais les arguments doivent être fournis de manière différente.

Par exemple, dans ma question originale, le moyen correct (et de travail) d'utiliser sous-processus.call () serait comme suit:

sous-processus.Call ('ZIP -P P4SSW0RD Certainfolder.zip Certainfolder / *', shell = true)

En réalité, ma ligne ressemble plus à:

subprocess.Call ('ZIP -P P4SSW0SRD' + archivename + '' + foldertoarchive, shell = true)

archivename et foldertoarchive est (je pense de manière assez explicative auto-explicative) que j'ai modifiée plus tôt.

Documentation:

HTTPS: / /docs.python.org/3.7/Library/subprocess.html#ReplaCing-older-ponces-with-Le-subprocess-module

ou plus spécifiquement:

https://docs.python.org/3.7 /Library/subprocess.html#replacing-OS-System


0 commentaires