Что делать с сообщением об ошибке "Слишком длинная строка ввода"?

Я пытаюсь использовать os.system() для вызова другой программы, которая принимает вход и выходной файл. Команда, которую я использую, составляет ~ 250 символов из-за длинных имен папок.

Когда я пытаюсь вызвать команду, я получаю сообщение об ошибке: The input line is too long.

Я предполагаю, что существует 255 character limit (его построено с использованием системного вызова C, но я тоже не мог найти ограничений).

Я попытался изменить каталог с помощью os.chdir(), чтобы уменьшить длину пути к папке, но когда я пытаюсь использовать os.system() с "..\folder\filename", он, видимо, не может обрабатывать относительные имена путей. Есть ли способ обойти этот предел или заставить его распознавать относительные пути?

Ответ 1

Вместо этого вы должны использовать модуль подпроцесса. См. этот небольшой документ о том, как переписать вызовы os.system для использования подпроцесса.

Ответ 2

Даже неплохо использовать subprocess.Popen(), это не решает проблему.

Ваша проблема не ограничивается 255 символами, это было верно в DOS, а затем увеличено до 2048 для Windows NT/2000 и снова увеличилось до 8192 для Windows XP +.

Настоящим решением является обход очень старой ошибки в API Windows: _ popen() и _wpopen(),

Если вы когда-либо использовали кавычки во время командной строки, вам нужно добавить всю команду в квотах или вы получите сообщение об ошибке The input line is too long.

Все операционные системы Microsoft, начиная с Windows XP, имели ограничение на 8192 символов, которое теперь достаточно для любого приличного использования командной строки, но они забыли решить эту ошибку.

Чтобы преодолеть свою ошибку , просто включите всю свою команду в двойные кавычки, и если вы хотите узнать более реальный комментарий MSDN _popen().

Будьте осторожны, потому что они работают:

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

Но это не сработает:

""prog param""

Если вам нужна функция, которая добавляет кавычки, когда они необходимы, вы можете взять ее из http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

Ответ 3

Вы должны использовать subprocess вместо os.system.

Подпроцесс

имеет то преимущество, что вы можете изменить каталог для вас:

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!"

Модуль подпроцесса также содержит вспомогательные функции, если приведенное выше выглядит немного подробным.

Ответ 4

Предполагая, что вы используете окна, из обратных косых черт вы можете записать .bat файл из python, а затем os.system(). Это взломать.

Ответ 5

Убедитесь, что при использовании "\" в ваших строках они правильно экранируются.

Python использует символ "\" как escape-символ, поэтому строка "..\folder\filename" оценивается как "..folderfilename", так как escape-f все еще является f.

Возможно, вы захотите использовать

r"..\folder\filename"

или

"..\\folder\\filename"

Ответ 6

Я получил одно и то же сообщение, но это было странно, потому что команда была не такой длинной (130 символов), и она работала, она просто перестала работать в один прекрасный день. Я просто закрыл окно команд и открыл новый, и он сработал. У меня давно появилось окно команд (возможно, несколько месяцев, это удаленная виртуальная машина). Я предполагаю, что некоторые ошибки Windows с буфером или чем-то.