Я работаю в среде Windows (на моем ноутбуке!), И мне нужна пара сценариев, которые запускают другие программы, почти как пакетный файл Windows.
как я могу запустить команду из Python, чтобы программа при запуске заменила скрипт? Программа является интерактивной (например, в унисон) и постоянно печатает строки и запрашивает ввод пользователя.
Итак, просто запустить программу и распечатать результат будет недостаточно. Программа должна взять на себя ввод / вывод сценария, что очень похоже на запуск команды из файла .bat.
Я пробовал os.execl, но он продолжает говорить мне «недопустимые аргументы», а также не находит имя программы (не ищет переменную PATH); Я должен указать ему полный путь ..?!
в основном, в пакетном скрипте я могу написать: унисонный профиль
как я могу добиться того же эффекта в Python?
Обновлено:
Я узнал, что это можно сделать с помощью os.system( ... ), и, поскольку я не могу принять свой ответ, закрываю вопрос.
Обновлено: это должен был быть комментарий, но когда я его опубликовал, у меня не было особого смысла.
Спасибо, Клаудиу, это почти то, что я хочу, за исключением небольшого момента: я хочу, чтобы функция завершалась, когда программа завершается, но когда я пробую ее в унисон, она возвращает управление не скрипту python, а окнам. среда командной строки
>>> os.execlp("unison")
C:\>Usage: unison [options]
or unison root1 root2 [options]
or unison profilename [options]
For a list of options, type "unison -help".
For a tutorial on basic usage, type "unison -doc tutorial".
For other documentation, type "unison -doc topics".
C:\>
C:\>
C:\>
как это обойти?
Нет необходимости закрывать вопрос, потому что вы не можете принять свой ответ. Если он получил наибольшее количество голосов, то он в основном такой же, как и принятый ... Признаться, немного раздражает, но закрытие - неправильный путь, я бы сказал ...






Вы должны создать новый процесс, используя модуль подпроцесса.
Я плохо разбираюсь в процессах Windows, но его функция Popen является кроссплатформенной, и ее следует предпочесть решениям для ОС.
Обновлено: Я утверждаю, что вы должны предпочесть модуль Subprocess для функций, специфичных для ОС *, он кроссплатформенный и более питонический (просто погуглите). Результат можно легко дождаться, и чисто:
import os
import subprocess
unison = os.path.join(os.path.curdir, "unison")
p = subprocess.Popen(unison)
p.wait()
Извини, это моя вина. Я был уверен, что подпроцесс не подключит STDIN / STDOUT при таком использовании. Очевидно, теперь уже слишком поздно отменить мой голос.
os.execlp должен работать. Это будет искать команду на вашем пути. Не давайте ему никаких аргументов, если они не нужны:
>>> import os
>>> os.execlp("cmd")
D:\Documents and Settings\Claudiu>Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
D:\Documents and Settings\Claudiu>
следует использовать модуль subprocess
import subprocess
proc = subprocess.Popen(['unison', 'profile'], stderr=subprocess.PIPE,
stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write('user input')
print proc.stdout.read()
Это должно помочь вам начать работу. Пожалуйста, отредактируйте свой вопрос, указав больше информации, если вы хотите получить более подробный ответ!
Я узнал, что os.system делает то, что я хочу,
Спасибо за все, что пытались помочь.
os.system("dir")
выполняет команду так же, как если бы она была запущена из командного файла
Это помогает предоставить сценарий, который не работает.