Запуск bcdedit из python в Windows 2008 SP2 - PullRequest
0 голосов
/ 07 января 2010

Я не очень хорошо знаю Windows, поэтому это может объяснить мою дилемму ...

Я пытаюсь запустить bcdedit в Windows 2008R2 из Python 2.6.

Моя подпрограмма Python для запуска команды выглядит следующим образом:

def run_program(cmd_str):
    """Run the specified command, returning its output as an array of lines"""
    dprint("run_program(%s): entering" % cmd_str)
    cmd_args = cmd_str.split()
    subproc = subprocess.Popen(cmd_args, stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE, shell=True)
    (outf, errf) = (subproc.stdout, subproc.stderr)
    olines = outf.readlines()
    elines = errf.readlines()
    if Options.debug:
        if elines:
            dprint('Error output:')
            for line in elines:
                dprint(line.rstrip())
        if olines:
            dprint('Normal output:')
            for line in olines:
                dprint(line.rstrip())
    errf.close()
    outf.close()
    res = subproc.wait()
    dprint('wait result=', res)
    return (res, olines)

Я вызываю эту функцию так:

(res, o) = run_program('bcdedit /set {current} MSI forcedisable')

Эта команда работает, когда я набираю ее из окна cmd, и работает, когда я помещаю ее в командный файл и запускаю из окна командной строки (конечно, от имени администратора).

Но когда я запускаю его из Python (как администратор), Python утверждает, что не может найти команду, возвращая:

bcdedit is not recognized as an internal or external command,
operable program or batch file

Кроме того, если я пытаюсь запустить мой пакетный файл из Python (который работает из командной строки), он также завершится неудачно. Я также пробовал это с полным путем к bcdedit, с теми же результатами.

Что такое вызов bcdedit из Python, который делает его не найденным?

Обратите внимание, что я могу вызывать другие файлы EXE из Python, поэтому я уверен, что мой код Python нормален ... но кто знает.

Любая помощь будет наиболее ценной.

Ответы [ 4 ]

0 голосов
/ 14 февраля 2010

Windows 2008 R2 только для 64-битных систем, да? Python - это 32-битный процесс. Когда 32-разрядное приложение запускает что-то из C:\Windows\System32, Windows фактически выглядит как C:\Windows\SysWOW64. Использование C:\Windows\SysNative.

0 голосов
/ 07 января 2010

Проверьте переменную PATH и посмотрите, есть ли там C: \ windows \ system32. (используйте набор в DOS)

0 голосов
/ 14 февраля 2010

По какой-то причине я экспериментирую с той же проблемой из c #. Если я перечислю файлы, это не было здесь, но когда я смотрел из Проводника, это было там. возможно это какой-то защищенный файл. Чтобы вызвать bcdedit.exe, я вручную скопировал его из system32 в папку своего приложения, и это сработало. В папке windows \ winsxs есть еще один. Я могу запустить его из своего приложения, но я не уверен, что это один и тот же путь на всех компьютерах.

Надеюсь, это поможет!

0 голосов
/ 07 января 2010

Возможно, путь к bcdedit.exe не указан в вашем системном пути, когда Python по какой-то причине работает (например, с другой учетной записью пользователя). Вы можете узнать это, напечатав:

os.environ.get("PATH")

Он разделен точкой с запятой, поэтому os.environ.get("PATH").split(';') может быть более полезным.

Я не вижу никакой причины, по которой его там нет, но на всякий случай вам нужно искать C:\Windows\System32, где C - буква вашего диска Windows.

...