#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.73. @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 «»