Окна 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")