Помогите с subprocess.call на компьютере с Windows

Я пытаюсь изменить плагин trac, который позволяет загружать вики-страницы в текстовые документы. pagetodoc.py выдает исключение в этой строке:

# Call the subprocess using convenience method
retval = subprocess.call(command, shell=True, stderr=errptr, stdout=outptr, close_fds = True)

Говорит, что close_fds не поддерживается в Windows. Кажется, что процесс создает некоторые временные файлы в C:\Windows\Temp. Я попытался удалить параметр close_fds, но затем файлы, которые подпроцесс записывает, остаются открытыми на неопределенный срок. Затем возникает исключение, когда файлы записываются позже. Я впервые работаю с Python и не знаком с библиотеками. Это еще более сложно, так как большинство людей, вероятно, кодируют на машинах Unix. Любые идеи, как я могу переработать этот код?

Спасибо!


person Shawn    schedule 19.03.2009    source источник


Ответы (1)


close_fds поддерживается в Windows (ищите «close_fds» после этой ссылки), начиная с Python 2.6 (если stdin/stdout/stderr не перенаправлены). Вы можете рассмотреть возможность обновления.

ОБНОВЛЕНИЕ 2017-11-16 после отрицательного голосования (почему?): Из связанного документа:

Обратите внимание, что в Windows вы не можете установить для close_fds значение true, а также перенаправить стандартные дескрипторы, установив stdin, stdout или stderr.

Таким образом, вы можете либо subprocess.call с close_fds = True, не устанавливая stdin, stdout или stderr (по умолчанию) (или устанавливая их на None):

subprocess.call(command, shell=True, close_fds = True)

или вы subprocess.call с close_fds = False:

subprocess.call(command, shell=True, stderr=errptr, stdout=outptr, close_fds = False)

или (Python >= 3.2) вы позволяете subprocess.call самостоятельно определить значение close_fds:

subprocess.call(command, shell=True, stderr=errptr, stdout=outptr)

person ax.    schedule 19.03.2009
comment
Я не уверен, что обновление возможно, нам пришлось понизить версию, чтобы заставить trac работать в Windows: ‹ - person Shawn; 19.03.2009
comment
начиная с Python 2.7.9, я получаю ValueError: close_fds is not supported on Windows plateforms if you redirect stdin/stdout/stderr. Который может отличаться от сообщения об ошибке из OP, но все же создается формой платформы Windows и предполагает, что если поддержка close_fds есть, она все еще ограничена. - person vaab; 26.03.2015
comment
@vaab Смотрите мое обновление, где я пытаюсь решить эту проблему. - person ax.; 16.11.2017