10

これが以前に尋ねられた場合はお詫びします。私はそれを検索しましたが、すべてのヒットは argparse に関するものではなく、一般的な Python の生の文字列に関するもののようです。

とにかく、ユーザーが文字列を入力し、この文字列が処理されるコードがあります。\nただし、コードでとを区別できるように\\nして、ユーザーが改行を取得するか\n出力に表示するかを (それぞれ) 制御できるようにするため、問題があります。

これ自体は非常に単純で、文字列などをチェックするロジックを動作させることができます。ただし、argparse は入力文字列をそのまま保持していないようです。したがって、次のように書くHere is a list:\nItem 1と、 として解析されHere is a list:\\nItem 1ます。\n入力文字列を に置き換えるとまったく同じものが解析されるため\\n、両者を区別できなくなります。

ボッジを含めることもできます (たとえば、出力に表示するため、または改行のためだけに$\nユーザーに入力させることができます)。しかし、これは面倒で、コードの使用を複雑にします。\n\n

argparse によって解析される文字列が生であることを確認する方法はありますか? (つまり、入力する\nと解析されますが、解析\nされません\\n

繰り返しますが、これが以前に尋ねられた場合は申し訳ありませんが、答えを見つけることができませんでした.1時間以上答えを見つけようとした後、私はアイデアがありません. ありとあらゆる助けを事前に乾杯してください。

サンプル コード (これが機能しない場合は申し訳ありません。argparse のサンプル コードを実行する最善の方法がわかりません!):

import argparse

parser = argparse.ArgumentParser( description = 'Test.' )
parser.add_argument( 'text', action = 'store', type = str, help = 'The text to parse.' )

args = parser.parse_args( )

print( repr( args.text ) )
4

3 に答える 3

4

問題の可能な解決策は次のとおりです。

import argparse

parser = argparse.ArgumentParser(description='Test.')
parser.add_argument('text', action='store', type=str, help='The text to parse.')

args = parser.parse_args()

print '-' * 80
raw_text = eval('"' + args.text.replace('"', '\\"') + '"')
print raw_text
print '-' * 80
print args.text

ただし、1 つ注意してください。eval は本当に危険です。

于 2016-08-24T10:21:21.763 に答える
2

コメントに記載されているように、シェルと Python インタープリターによって生成されるリストである で argparse動作します。sys.argv

簡単なargvエコー スクリプトを使用すると、次のようになります。

0928:~/mypy$ cat echo_argv.py
import sys
print(sys.argv)

私は(bashシェルで)得ます:

0929:~/mypy$ python echo_argv.py Here is a list:\nItem 1 
['echo_argv.py', 'Here', 'is', 'a', 'list:nItem', '1']
0931:~/mypy$ python echo_argv.py "Here is a list:\nItem 1 "
['echo_argv.py', 'Here is a list:\\nItem 1 ']
0931:~/mypy$ python echo_argv.py "Here is a list:\\nItem 1 "
['echo_argv.py', 'Here is a list:\\nItem 1 ']

argparseargvそれを文字列のリストとして扱います。少なくともデフォルトのNone typeパラメーターでは、これらの文字列には何もしません。

于 2016-08-24T16:34:13.423 に答える
2

@hpaulj が指摘したように、問題はシェルとsys.argv動作方法に起因するものです。オプションは、取得したエスケープ文字で文字列を処理することです。

SO: Process escape sequence in a string in Pythonに関するこの回答をご覧ください 。基本的に、string_escapeまたはを使用unicode_escapeして文字列を処理します。文字列を手で扱うよりも優れています。

于 2017-10-05T19:00:31.587 に答える