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

StackOverflow https://stackoverflow.com/questions/682799

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

В реальное решение заключается в обходе очень старой ошибки в Windows API: _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

Вы должны использовать подпроцесс вместо 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!"

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

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

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

Python использует '\' в качестве управляющего символа, поэтому строка "..\folder\filename" оценивает, чтобы "..folderfilename" поскольку экранированное f по-прежнему является f.

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

r"..\folder\filename"

или

"..\\folder\\filename"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top