6

optparse を使用する場合、オプションの後に文字列全体を取得したいのですが、最初のスペースまでの一部しか取得できません。

例えば:

python myprog.py --executable python someOtherProg.py

「実行可能ファイル」に表示されるのは「python」だけです。

optparse を使用してそのような行を解析することは可能ですか、それとも argparse を使用する必要がありますか?

€: 既に "s で囲みました。しかし、コードをさらに掘り下げた後、サブプロセス呼び出しが引数を処理できないことがわかりました。

コマンドラインの文字列は、リスト「args」に詰め込まれます。

args = [self.getExecutable()] + self.getArgs().split()

みたいな

"[python D:\\\workspace\\\myprog\\\src\\\myprog.py]"

これにより、システムがファイルの例外を見つけることができません。私が使うとき

args[0]

できます。しかし、実行可能ファイルへの引数を失います。

サブプロセス モジュールは、最初に文字列を取得しない場合、リストからコマンドラインを構築するため、現時点ではその動作を説明できません。

4

5 に答える 5

12

それらを引用符で囲んで、既存のコードで機能させることができます。

python myprog.py --executable "python someOtherProg.py"

optparseを使用してそのような行を解析することは可能ですか、それともargparseを使用する必要がありますか?

optparse私は実際に仕事をしたことがないので、あなたがそれを行うことができるかどうか/どのようにできるかわかりませんoptparse

しかし、私はあなたを助けることができますargparse。簡単な例を次に示します。

#!/usr/bin/python
import argparse, sys

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Demonstration of Argparse.')
    parser.add_argument('-e', '--executable', nargs = '+', help = 'List of executables')
    args = parser.parse_args(sys.argv[1:])
    print args.executable

そして使用法:

manoj@maruti:~$ python myprog.py --executable python someOtherProg.py
['python', 'someOtherProg.py']

optparseまた、からに切り替えることをお勧めしargparseます。2.7以降Optparse非推奨です。

于 2010-10-01T13:54:45.873 に答える
6

私は別の良い代替手段を見つけましたshlex- シンプルなシェルのような構文のための字句解析器クラスです。

ソース リンク:正規表現を使用してコマンド ラインを解析する方法は?

>>> import shlex
>>> shlex.split('"param 1" param2 "param 3"')
['param 1', 'param2', 'param 3']
>>> shlex.split('"param 1" param2 "param 3"')
Traceback (most recent call last):
    [...]
ValueError: No closing quotation
>>> shlex.split('"param 1" param2 "param 3\\""')
['param 1', 'param2', 'param 3"']
于 2011-08-31T08:54:06.937 に答える
4

表示される動作は、コマンド ラインを解析して sys.argv の単語に分割するのは、Python ではなくシェルであるという事実に由来します。Python は、シェルによって exec() を介して起動され、argv は既に設定されています。

ほとんどのシェルは、引用またはエスケープによって分割しないように指示しない限り、argv 項目をスペースで分割します。

引用は上記のように機能します。

多くのシェルでこれを行うことができます:

python myprog.py --executable python\ someOtherProg.py

バックスラッシュは、引用符を必要とせずに次のスペースをエスケープします。

于 2010-10-01T14:01:09.097 に答える
4

引数フラグの後に取得する単語数がわかっている場合は、--executableオプションを作成する方法を変更しoptparseて、状況を適切に処理できます。

オプション フラグの後に1 つの単語を指定する代わりに、2 つ(またはそれ以上) の単語optparseを検索するようにパーサーを設定できます。

from optparse import OptionParser
parser = OptionParser()

parser.add_option("-f", "--file", action="store", dest="filename",
                       help="File to be processed.", metavar="FILE")
parser.add_option("-e", "--executable", action="store", dest="my_exe",
                       help="Command to be executed", metavar="EXE",
                       nargs=2)

このスニペットでは、-for--fileオプションは 1 つの単語のみを想定し、それを文字列 (デフォルト) としてfilename変数に格納します。

対照的に-e--executableオプションは、オプションのために 2 つの単語を想定していnargs=2ます。これにより、-eor--executableフラグの後ろにある 2 つの単語が文字列として Python list に格納されますmy_exe

チェックアウト: http://docs.python.org/library/optparse.htmlの詳細についてoptparseは、argparse.

于 2010-10-03T15:57:47.003 に答える
1

argparse にアップグレードできない場合は、この回答リストを完成させてください。

Optparse は、これらの状況(複数の文字列) を処理できません。nargs を使用して特定の量の変数を指定することしかできませんが、「1 つ以上」のようなものはありません。ハックするか、別のライブラリ(argparse など)を使用する必要があります。

于 2011-07-26T10:36:48.590 に答える