NameError: имя «буфер» не определено в пакетном файле платформы на основе Ant

Я использую скрипт python для выполнения пакетного файла на основе Ant (Helium.bat)

subprocess.Popen('hlm '+commands, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Однако сценарий всегда будет останавливаться и отображать следующую ошибку при выполнении файла .bat:

import codecs
  File "C:\Python25\lib\codecs.py", line 1007, in <module>
    strict_errors = lookup_error("strict")
  File "C:\Python25\lib\codecs.py", line 1007, in <module>
    strict_errors = lookup_error("strict")
  File "C:\Python25\lib\encodings\__init__.py", line 31, in <module>
    import codecs, types
  File "C:\Python25\lib\types.py", line 36, in <module>
    BufferType = buffer
NameError: name 'buffer' is not defined

Если я выполню .bat непосредственно в командной строке, проблем не возникнет.


person BiX    schedule 13.12.2010    source источник


Ответы (1)


Я думаю, что по крайней мере часть проблемы заключается в том, как вы выполняете командный файл. Попробуйте это:

# execute the batch file as a separate process and echo its output
Popen_kwargs = { 'stdout': subprocess.PIPE, 'stderr': subprocess.STDOUT,
                 'universal_newlines': True }
with subprocess.Popen('hlm '+commands, **Popen_kwargs).stdout as output:
    for line in output:
        print line,

Это передает разные аргументы в Popen - разница в том, что эта версия удаляет shell=True, который не нужен в пакетном файле, устанавливает stderr=subprocess.STDOUT, который перенаправляет stdout в то же место, куда направляется стандартный вывод, чтобы избежать пропуска каких-либо сообщений об ошибках, и добавляет universal_newlines=True чтобы сделать вывод более читабельным.

Еще одно отличие состоит в том, что он считывает и печатает выходные данные процесса Popen, что фактически заставит скрипт Python, запускающий пакетный файл, ждать завершения его выполнения, прежде чем продолжить, что, как я подозреваю, важно.

person martineau    schedule 13.12.2010
comment
@BiX: Очень маловероятно, что в codecs.py есть SyntaxError - должен быть любой файл, содержащий строку кода с no viable alternative at input '""' в нем. Скорее всего, вы получите Glade ImportError, потому что его необходимо переустановить после обновления Python (это не стандартный модуль библиотеки Python). - person martineau; 14.12.2010
comment
Эти ошибки не возникнут, если я просто использую пакетный файл в командной строке вместо того, чтобы выполнять его из скрипта Python. К сожалению, я много раз пытался переустановить Glade, и это все равно не сработало =/ - person BiX; 15.12.2010
comment
@BiX: я не понимал, что ты делаешь. Обновите свой вопрос, чтобы показать, как вы выполняете пакетный файл - похоже, что это может быть по крайней мере частью проблемы. - person martineau; 15.12.2010