Как заставить Python os.system() запускать функцию клиента tftp в Windows 10?

Использование Python 2.7 в Windows 10. Я хочу использовать tftp-клиент Windows. Почему os.system() дает результат, отличный от ввода команды tftp в командной строке? (Использование 2.7 вместо 3 и клиент Windows TFTP вместо поиска другой библиотеки — «потому что так сказал босс».)

Я не знаю, является ли это вопросом Python, вопросом Windows 10 или, в частности, TFTP-клиентом Windows 10.

Клиент TFTP установлен на моей машине. Если я открою командную оболочку и наберу tftp, я получу справочное сообщение от клиента tftp.

>tftp

Transfers files to and from a remote computer running the TFTP service.

TFTP [-i] host [GET | PUT] source [destination]
...

Но если я попробую из Python, клиент tftp не будет найден:

>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system('tftp')
'tftp' is not recognized as an internal or external command,
operable program or batch file.
1
>>>

Есть C:\Windows\system32\TFTP.EXE, а C:\Windows\system32 лежит у меня на пути. Если я попробую другой exe-файл из C:\Windows\system32, например tar.exe, он сработает:

>>> os.system('tar')
tar: Must specify one of -c, -r, -t, -u, -x
1

У меня на машине есть утилита "what", и она тоже не находит .exe файл для tftp, но находит tar, и это меня очень озадачивает. Я отмечаю, что TFTP.EXE имеет расширение в верхнем регистре, тогда как tar.exe в нижнем регистре, но Windows, насколько я знаю, никогда не была чувствительна к регистру, и в любом случае я пробовал обе команды в верхнем и нижнем регистре.

Кроме того, я думал, что os.system() просто передал строку системе для выполнения. Так что, конечно, Windows должна найти утилиту, если та же команда, введенная в командной строке, работает?

Я также попробовал os.system("cmd /c tftp") с теми же результатами - работает, если я набираю его в командной строке, а не из os.system(). Заключение tftp в кавычки или добавление явного .exe (или .EXE) также не работает.


person fpeelo    schedule 13.01.2020    source источник


Ответы (1)


В Windows 10, чтобы запустить tftp.exe из Python, мне нужно запустить C:\Windows\SysNative\tftp.exe

>>> os.system("c:\\windows\\system32\\tftp")
'c:\windows\system32\tftp' is not recognized as an internal or external command,
operable program or batch file.
1
>>> os.system("c:\\windows\\sysnative\\tftp")

Transfers files to and from a remote computer running the TFTP service.
...

C:\windows\system32\tftp.exe существует, но на этом компьютере нет C:\windows\sysnative\tftp.exe. На самом деле нет никакого sysnative каталога, даже поиск системных и скрытых файлов из оболочки, запущенной от имени администратора. Так что я этого не понимаю. Но это работает.

Мне это кажется хаком, который MS действительно должен препятствовать использованию tftp.exe, поэтому, возможно, мне следует понять намек.

person fpeelo    schedule 16.01.2020