Почему работает subprocess.Popen не работает

#python #dumpbin #subprocess

#python #корзина #подпроцесс

Вопрос:

Я много чего перепробовал, но по какой-то причине у меня ничего не получалось. Я пытаюсь запустить утилиту dumpbin MS VS с помощью скрипта Python.

Вот что я пробовал (и что у меня не сработало)

1.

 tempFile = open('C:\Windows\temp\tempExports.txt', 'w')
command = '"C:/Program Files/Microsoft Visual Studio 8/VC/bin/dumpbin" /EXPORTS '   dllFilePath
process = subprocess.Popen(command, stdout=tempFile)
process.wait()
tempFile.close()
  

2.

 tempFile = open('C:\Windows\temp\tempExports.txt', 'w')
command = 'C:/Program Files/Microsoft Visual Studio 8/VC/bin/dumpbin /EXPORTS '   dllFilePath
process = subprocess.Popen(command, stdout=tempFile)
process.wait()
tempFile.close()
  

3.

 tempFile = open('C:\Windows\temp\tempExports.txt', 'w')
process = subprocess.Popen(['C:\Program Files\Microsoft Visual Studio 8\VC\bin\dumpbin', '/EXPORTS', dllFilePath], stdout = tempFile)
process.wait()
tempFile.close()
  

есть ли у кого-нибудь идеи о том, как правильно делать то, что я пытаюсь сделать ( dumpbin /EXPORTS C:Windowssystem32kernel32.dll > tempfile.txt ) в Python?

Комментарии:

1. Возможно, вы захотите подробнее рассказать о том, как это не работает. Вы получаете какие-либо сообщения об ошибках или что-нибудь еще?

2. Вы пробовали 'C:\Program Files\Microsoft Visual Studio 8\VC\bin\dumpbin.exe' ?

3. @rumpel да, тоже не сработало.

4. @Thomas K ну, временный файл пуст, это то, что я подразумеваю под «не работает»

Ответ №1:

Шаблон аргументов для Popen ожидает список строк для вызовов, не связанных с оболочкой, и строку для вызовов оболочки. Это легко исправить. Учитывая:

 >>> command = '"C:/Program Files/Microsoft Visual Studio 8/VC/bin/dumpbin" /EXPORTS '   dllFilePath
  

Либо вызовите subprocess .Popen с shell=True :

 >>> process = subprocess.Popen(command, stdout=tempFile, shell=True)
  

или используйте shlex.split для создания списка аргументов:

 >>> process = subprocess.Popen(shlex.split(command), stdout=tempFile)
  

Комментарии:

1. пробовал оба, но не смог заставить его работать. кстати, dllpath: ‘C:\Windows\system32\user32.dll ‘ , может быть, это поможет..

2. примечание shell=true считается угрозой безопасности начиная с 2.7

3. @thundergolfer Это полностью зависит от того, управляете ли вы командой (как в вопросе OP) или из ненадежного внешнего источника: docs.python.org/2.7/library /…

Ответ №2:

 with tempFile:
    subprocess.check_call([
        r'C:Program FilesMicrosoft Visual Studio 8VCbindumpbin.exe',
        '/EXPORTS', 
        dllFilePath], stdout=tempFile)
  

Комментарии:

1. хорошо, теперь мы уверены, что это не работает 🙂 подпроцесс. CalledProcessError: команда ‘[‘C:\Program Файлы\Microsoft Visual Studio 8\VC\bin\dumpbin.exe ‘, ‘/ЭКСПОРТ’, ‘C:\Windows\system32\user32.dll ‘]’ возвращенный ненулевой статус выхода -1073741515

2. когда я делаю это: subprocess.check_call(‘»C:\Program Файлы\Microsoft Visual Studio 8\VC\bin\dumpbin.exe » /EXPORTS ‘ dllFilePath, stdout=tempFile, shell=True) код выхода тот же, но после отладки я обнаружил, что dumpbin (или cmd.exe ) отображает сообщение: «Имя файласинтаксис имени каталога или метки тома неверен.’и отладка показала, что при shell=True выполняется команда: C:WINDOWSsystem32cmd.exe /c «»»C:Program Файлы Microsoft Visual Studio 8VCbindumpbin.exe » /ЭКСПОРТ C:Windowsystem32user32.dll «»