2013-02-13 3 views
0

Я работаю над программой, которая найдет некоторые файлы и предоставит информацию о файле скрипту NSIS. Сценарий NSIS принимает командную строку следующим образом:Запуск окон, исполняемый из скрипта python с несколькими аргументами

makensis.exe /DON="This is one" /DOD="c:\path1\path2 to dir\path 3" scriptfile.nsi 

Значения переключателей будут меняться при каждом выполнении программы. Я попытался выполнить это, используя subprocess.call и subprocess.Popen. Проблема, которую я имею, связана с цитированием.

Прежде всего вызовы подпроцесса, кажется, помещают весь аргумент аргумента между двойными кавычками, делающими NSIS, рассматривающими их как один аргумент. Во-вторых, я затрудняюсь с тем, чтобы отдельные ключи правильно указывали в командной строке. Вот фрагмент того, как выглядит моя программа.

subprocess.Popen([setup.profile['NSISExe'], ' /DON="' + setup.profile['DESC'] + '" /DOD="' + setup.profile['InstallDir'] + \ 
    '" /DMT="' + app.machine_type.get() + '" /DSD="' + os.path.join(WinShellVar.LOCAL_APPDATA, 'MLC CAD', appname) + \ 
    '" /DXV=X6 ' + setup.profile['NSISScript']]) 

А вот выход из NSIS

Can't open script " /DON="Mastercam X6 Standard" /DOD="C:\Users\John\Desktop" /D 
MT="mill" /DSD="C:\Users\John\AppData\Local\MLC CAD\mcdeftool" /DXV=X6 bin\packa 
ge.002.nsi" 

Как вы можете видеть, я использую смешанный пакет данных, получить некоторые биты для dicts и некоторые из класса вызывает (легко мне если мои условия несколько неправильны, я изучаю python уже около 4 дней, поправьте меня, пожалуйста, просто красиво). Если вы используете эти данные, это «unpythonic», дайте мне знать.

Заглядывая вперед к введенному

+0

В качестве примечания к стилю вам не понадобится завершающая '\' для продолжения строки в python, если вокруг будет какая-то разногласия. например '([{' – mgilson

+0

re: мой предыдущий комментарий - Дальнейшие объяснения можно найти в руководстве по стилю python [http://www.python.org/dev/peps/pep-0008/#indentation) – mgilson

ответ

2

отказ от ответственности - я не использую окна


Я думаю, что вы, вероятно, хотите что-то вроде:

subprocess.Popen([setup.profile['NSISExe'], '/DON=' + setup.profile['DESC'], 
        '/DOD=' + setup.profile['InstallDir'], 
        '/DMT=' + app.machine_type.get(), 
        '/DSD=' + os.path.join(WinShellVar.LOCAL_APPDATA, 'MLC CAD', appname), 
        '/DXV=X6', 
        setup.profile['NSISScript']]) 

Когда оболочка читает в командной строке, он разбивается на невостребованные, неэкранированные пробелы. Когда вы передаете список в Popen, он ожидает, что элементы списка будут выглядеть так, как только он разорвет аргументы. Другой вариант состоит в том, чтобы передать строку (вместо списка) точно, как вы бы поместили ее в оболочку окна и пропустили shell=True до Popen. Но этот метод не является предпочтительным, так как он гораздо более уязвим для неуверенности оболочек.

+0

Это работает Я вижу, что проблема заключалась в том, что я пытался дать python большую помощь. Какой потрясающий язык, любящий его до сих пор! –

+0

@JohnMcCord - только улучшается :). Я работаю с ним уже 2 года, и я все больше и больше наслаждаюсь этим каждый день :) – mgilson

Смежные вопросы