0

いくつかのファイルを見つけて、ファイル情報を NSIS スクリプトに提供するプログラムに取り組んでいます。NSIS スクリプトは、次のようにコマンド ラインを受け入れます。

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

スイッチの値は、プログラムを実行するたびに変化します。subprocess.call と subprocess.Popen を使用してこれを実行しようとしました。私が抱えている問題は、引用に関係しています。

まず第一に、サブプロセス呼び出しは引数ステートメント全体を二重引用符で囲んで、NSIS がそれらを 1 つの引数と見なすようにします。次に、個々のスイッチをコマンド ラインで適切に引用するのに苦労しています。これは、私のプログラムが現在どのように見えるかのスニペットです。

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"

ご覧のとおり、私はデータの混合バッグを使用しており、辞書用のビットとクラス呼び出しからいくつかのビットを取得しています(私の用語が多少間違っている場合は簡単にしてください。私は約4日間Pythonを学んでいます。修正してくださいうまく)。 このデータをこのように使用するのが「非 Pythonic」である場合は、お知らせください。

あなたの入力をお待ちしております

4

1 に答える 1

2

免責事項 -- 私は Windows を使用していません


おそらく次のようなものが必要だと思います:

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、シェルが引数を分割した後にリスト要素がどのように見えるかが期待されます。もう 1 つのオプションは、(リストの代わりに) 文字列を、Windowsシェルに入れshell=TruePopen. しかし、この方法は、シェル インジェクションの脆弱性に対してはるかに脆弱であるため、推奨されません。

于 2013-02-13T02:19:50.910 に答える