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

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

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

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

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

6 ответов


вместо этого следует использовать модуль подпроцесса. См.этой маленький документ для того, как переписать ОС.системные вызовы для использования подпроцесса.


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

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

на реальное решение это обойти очень старую ошибку в Windows APIs:_popen() и _wpopen().

если вы когда-либо использовать кавычки в командной строке нужно добавьте всю команду в quoates или вы получите 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


вы должны использовать подпроцесс вместо ОС.система.

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

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

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


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


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

Python использует " \ " в качестве escape-символа, поэтому строка "..\folder\filename" значение "..folderfilename" так как сбежавший f по-прежнему f.

вы, вероятно, хотите использовать

r"..\folder\filename"

или

"..\folder\filename"

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