Окна Mapping Drives Python: как обрабатывать, когда Win cmd Line требует ввода

Добрый день,

Я использовал версию этого метода для сопоставления дюжины букв дисков:

# Drive letter: M
# Shared drive path: \\shared\folder
# Username: user123
# Password: password
import subprocess

# Disconnect anything on M
subprocess.call(r'net use * /del', shell=True)

# Connect to shared drive, use drive letter M
subprocess.call(r'net use m: \\shared\folder /user:user123 password', shell=True)

Приведенный выше код прекрасно работает, пока у меня нет папки с файлом, используемым программой.

Если я запускаю ту же команду только в окне cmd, и файл используется, когда я пытаюсь отключить диск, он возвращает сообщение " Вы уверены?" Да / Нет

Как я могу передать этот вопрос пользователю с помощью сценария Py (или, если ничего другого, принудительно отключить, чтобы код мог продолжать работать?

1 ответ

Решение

Для принудительного отключения попробуйте /yes вот так

subprocess.call(r'net use * /del /yes', shell=True)  

Чтобы "перенаправить" вопрос пользователю, у вас есть (как минимум) 2 возможных подхода:

  • Чтение и запись в стандартный поток ввода / вывода подпроцесса
  • Работайте с кодами выхода и при необходимости запускайте подпроцесс еще раз

Первый подход очень хрупкий, так как вы должны прочитать стандартный вывод и интерпретировать его, который специфичен для вашей текущей локали, а также ответить позже на вопрос, который также специфичен для вашей текущей локали (например, подтверждение будет сделано с помощью "Y" в Английский, но с 'J' на немецком и т. Д.)

Второй подход более стабилен, так как использует более или менее статические коды возврата. Я сделал быструю проверку, и в случае отмены вопроса код возврата равен 2; в случае успеха, конечно, просто 0. Таким образом, с помощью следующего кода вы сможете обработать вопрос и действовать в соответствии с пользовательским вводом:

import subprocess

exitcode = subprocess.call(r'net use * /del /no', shell=True)
if exitcode == 2:
    choice = input("Probably something bad happens ... still continue? (Y/N)")
    if choice == "Y":
        subprocess.call(r'net use * /del /yes', shell=True)
    else:
        print("Cancelled")
else:
    print("Worked on first try")
Другие вопросы по тегам