Question

Je suis en train d'utiliser os.system () pour appeler un autre programme qui prend une entrée et un fichier de sortie. La commande que j'utilise est ~ 250 caractères en raison des longs noms de dossier.

Quand je tente d'appeler la commande, je reçois une erreur: The input line is too long

.

Je suppose qu'il ya un 255 character limit (son construit en utilisant un appel système C, mais je ne pouvais pas trouver les limites de ce soit).

J'ai essayé de changer le répertoire avec os.chdir() pour réduire la longueur de piste de dossier, mais quand j'essayer d'utiliser os.system() avec "..\folder\filename" il semble ne peut pas gérer les chemins relatifs. Y at-il moyen de contourner cette limite ou l'obtenir à reconnaître les chemins relatifs?

Était-ce utile?

La solution

Vous devez utiliser le module subprocess à la place. Voir ce petit doc pour savoir comment réécrire os.system appelle à utiliser le sous-processus .

Autres conseils

Même c'est une bonne idée d'utiliser subprocess.Popen(), cela ne résout pas le problème.

Votre problème n'est pas les limite de 255 caractères , cela était vrai sur les temps DOS, a augmenté plus tard à 2048 pour Windows NT / 2000, et a de nouveau augmenté à 8192 pour Windows XP +.

La vraie solution est de contourner un bogue très ancien dans les API Windows: _ popen () et _wpopen () .

Si jamais vous utilisez des guillemets au cours de la ligne de commande, vous devez ajouter la commande entière dans quoates ou vous obtiendrez le message d'erreur The input line is too long.

Tous les systèmes d'exploitation Microsoft Windows XP en commençant par un 8192 avaient des caractères limite qui est maintenant suffisant pour toute utilisation de la ligne de commande décente, mais ils ont oublié de résoudre ce bug.

Pour surmonter leur bogue Il suffit d'inclure votre commande entière entre guillemets , et si vous voulez en savoir plus réel MSDN commentaire sur _popen () .

Faites attention parce que ces travaux:

prog
"prog"
""prog" param"
""prog" "param""

Mais ceux-ci ne fonctionnera pas:

""prog param""

Si vous avez besoin d'une fonction qui fait ajouter les guillemets quand ils sont nécessaires, vous pouvez prendre une http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

Vous devez utiliser au lieu de sous-processus os.system.

a subprocess l'avantage de pouvoir changer le répertoire pour vous:

import subprocess
my_cwd = r"..\folder\"
my_process = subprocess.Popen(["command name", "option 1", "option 2"], cwd=my_cwd)
my_process.wait() # wait for process to end
if my_process.returncode != 0:
    print "Something went wrong!"

Le module subprocess contient des fonctions d'aide et si les regards au-dessus un peu bavard.

En supposant que vous utilisez Windows, des anti-slash, vous pouvez écrire un fichier .bat de python et os.system() ensuite sur ce point. Il est un hack.

Assurez-vous que lorsque vous utilisez « \ » dans vos chaînes qu'ils sont correctement saisies.

Python utilise le « \ » comme le caractère d'échappement, de sorte que la chaîne "..\folder\filename" évalue à "..folderfilename" puisqu'un f échappé est encore un f.

Vous voulez probablement utiliser

r"..\folder\filename"

ou

"..\\folder\\filename"

Je suis le même message mais il était étrange parce que la commande était pas si longtemps (130 caractères) et il travaillait, il a juste cessé de travailler un jour. Je fermais la fenêtre de commande et a ouvert une nouvelle et cela a fonctionné. J'ai eu la fenêtre de commande ouverte depuis longtemps (peut-être des mois, il est une machine virtuelle à distance). Je suppose un bug de Windows avec un tampon ou quelque chose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top