Ответ 1
Вместо этого вы должны использовать модуль подпроцесса. См. этот небольшой документ о том, как переписать вызовы os.system для использования подпроцесса.
Я пытаюсь использовать os.system() для вызова другой программы, которая принимает вход и выходной файл. Команда, которую я использую, составляет ~ 250 символов из-за длинных имен папок.
Когда я пытаюсь вызвать команду, я получаю сообщение об ошибке: The input line is too long
.
Я предполагаю, что существует 255 character limit
(его построено с использованием системного вызова C, но я тоже не мог найти ограничений).
Я попытался изменить каталог с помощью os.chdir()
, чтобы уменьшить длину пути к папке, но когда я пытаюсь использовать os.system()
с "..\folder\filename"
, он, видимо, не может обрабатывать относительные имена путей. Есть ли способ обойти этот предел или заставить его распознавать относительные пути?
Вместо этого вы должны использовать модуль подпроцесса. См. этот небольшой документ о том, как переписать вызовы os.system для использования подпроцесса.
Даже неплохо использовать 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
Вы должны использовать 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!"
Модуль подпроцесса также содержит вспомогательные функции, если приведенное выше выглядит немного подробным.
Предполагая, что вы используете окна, из обратных косых черт вы можете записать .bat файл из python, а затем os.system()
. Это взломать.
Убедитесь, что при использовании "\" в ваших строках они правильно экранируются.
Python использует символ "\" как escape-символ, поэтому строка "..\folder\filename"
оценивается как "..folderfilename"
, так как escape-f все еще является f.
Возможно, вы захотите использовать
r"..\folder\filename"
или
"..\\folder\\filename"
Я получил одно и то же сообщение, но это было странно, потому что команда была не такой длинной (130 символов), и она работала, она просто перестала работать в один прекрасный день. Я просто закрыл окно команд и открыл новый, и он сработал. У меня давно появилось окно команд (возможно, несколько месяцев, это удаленная виртуальная машина). Я предполагаю, что некоторые ошибки Windows с буфером или чем-то.