Что делать с сообщением об ошибке «Строка ввода слишком длинная»? - PullRequest
10 голосов
/ 25 марта 2009

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

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

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

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

Ответы [ 6 ]

18 голосов
/ 27 августа 2010

Даже если использовать 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

7 голосов
/ 25 марта 2009

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

2 голосов
/ 25 марта 2009

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

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

1 голос
/ 07 декабря 2010

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

1 голос
/ 25 марта 2009

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

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

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

r"..\folder\filename"

или

"..\\folder\\filename"
1 голос
/ 25 марта 2009

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

...