Что делать с сообщением об ошибке "входная строка слишком длинная"?
Я пытаюсь использовать ОС.системы() для вызова другой программы, которая принимает входной и выходной файл. Команду я использую ~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 с буфером или что-то в этом роде.