0
votes

Python renvoie une erreur, mais pas la ligne de commande

J'essaie d'utiliser cette commande pour obtenir tous les processus en cours d'exécution

os.system(r'wmic /output:C:\ProcessList.txt process get caption')
subprocess.call(r'wmic /output:C:\ProcessList.txt process get caption')

Lorsque je l'exécute dans cmd, cela fonctionne et génère tout dans le fichier spécifié.

Quand j'essaye d'exécuter ceci avec Python, j'obtiens une erreur disant:

os.system('wmic /output:C:\\ProcessList.txt process get caption')
subprocess.call('wmic /output:C:\\ProcessList.txt process get caption')

J'ai essayé de l'exécuter avec os.system et subprocess.call, mais les deux renvoient une erreur.

Invalid file name.

J'ai également essayé d'utiliser des chaînes brutes.

wmic /output:C:\\ProcessList.txt process get caption

Mais rien n'a fonctionné jusqu'à présent.


0 commentaires

3 Réponses :


0
votes

Python lit un \\ comme \, donc ce que vous devez faire est:

os.system('wmic /output:C:\\\\ProcessList.txt process get caption')


3 commentaires

Ne résout pas le problème. Toujours la même erreur. Mais je ne pense pas que ce que vous avez écrit soit correct, car cela alimenterait C:\\ProcessList.txt dans cmd, mais il devrait alimenter C:\ProcessList.txt


êtes-vous sûr que la sortie / before ne doit pas être un \? Je suis presque sûr que vous êtes un mélange de contre-obliques est le problème ici. try: os.system ('wmic \\ sortie: C: \\ ProcessList.txt processus get caption')


Quelqu'un d'autre m'a aidé à trouver la réponse. La syntaxe était correcte, mais c'était un problème de permission. Si vous êtes intéressé, regardez ma propre réponse. Je ne peux pas le marquer comme correct pendant 2 jours de plus, c'est pourquoi cette question est toujours ouverte.



0
votes

Comme vous pouvez le constater, vous utilisez 2 barres obliques inverses dans l'invite de commande. Donc, pour que le chemin fonctionne en python, vous aurez besoin de 4 barres obliques inverses. La raison en est que la barre oblique inverse ( \ ) est un caractère spécial dans une chaîne. Ainsi, pour utiliser un seul caractère de barre oblique inverse, vous devez échapper la barre oblique inverse, ce qui est fait en plaçant 2 barres obliques inverses dos à dos comme ceci: \\ . Vous pouvez également utiliser des chaînes brutes qui ne sont rien d'autre qu'une chaîne précédée d'un "r" ( r'...' ) qui échappe automatiquement toutes les barres obliques inverses.

Ainsi, vous pouvez utiliser l'un des éléments suivants:

  • Utilisation de chaînes brutes (échappe automatiquement les contre-obliques):

    'wmic /output:C:\\\\ProcessList.txt process get caption'
    
  • Échapper manuellement les contre-obliques (4 contre-obliques):

    r'wmic /output:C:\\ProcessList.txt process get caption'
    


1 commentaires

Quelqu'un d'autre m'a donné ceci comme réponse et cela n'a pas fonctionné. Cmd doit obtenir C:\ProcessList.txt et non C:\\ProcessList.txt



0
votes

@Carcigénicate

m'a aidé à trouver la réponse. Le code de sa réponse m'a donné la vraie erreur. Mon code me donnait Invalid file name. Son code a renvoyé: Permission denied: C\\ProcessList.txt donc un problème d'autorisation. Je viens de lancer mon IDE avec les droits d'administrateur et cela a fonctionné.

Pour éviter d'avoir à exécuter mon IDE en mode administrateur tout le temps, j'ai simplement enterré le fichier dans Documents, donc je n'ai pas besoin de privilèges d'administrateur pour y accéder.


0 commentaires