web-dev-qa-db-ja.com

Python Argparse:生の文字列入力

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

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

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

ボッジを含めることができます(たとえば、出力に表示される$\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 ) )
7
Steve

コメントに記載されているように、argparsesys.argv、シェルとPythonインタープリターによって生成されるリスト。

単純な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 ']

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

2
hpaulj

これがあなたの問題に対する可能な解決策です:

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は本当に危険です

2
BPL

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

SOでこの答えを見てください: Pythonで文字列のエスケープシーケンスを処理する 。基本的に、string_escapeまたはunicode_escapeを使用して文字列を処理します。弦を手で扱うよりはましです。

1
bizi