optparse转义控制字符

Optparse似乎正在逃脱我通过的控制字符
命令行上的论点.这是一个错误吗?我想念吗?
某物?可以预防或解决吗?
非控制字符不会发生这种行为.
例如,如果此程序(称为test.py):
从optparse导入选项器
Parser = optionParser()
parser.add_option(" - d",dest ="定界符",action =" store")
(选项,args)= parser.parse_args()
打印选项
如下以下操作:
python test.py -d'\ t'
它输出:
{'Delimiter':'\\ t'}
即,\ t具有一个逃脱字符以给出\\ t.

# 回答1


它与Optparse无关,这就是Python打印字符串的方式:
$ python -c'导入系统;打印sys.argv''\ t'
['-c','\\ t']
请注意,您并没有真正将控制字符传递给Python,
您正在传递由\和t组成的两字符字符串.什么时候
代表数据结构内的字符串,Python逃脱了\
避免与\ t这样的真实控制字符混淆.
如果您尝试打印字符串本身,您会发现一切都是
正确的:
$ python -c'导入系统;打印sys.argv [1]'\ t'
\ t
# 回答2


您错过了字符串对象的内容之间的区别,
以及相应的字符串字面外观.
{'Delimiter':'\\ t'}
'\\ t'
\ t
2
# 回答3


8月19日,1:45*pm,hrvoje niksic 它与Optparse无关,这就是Python打印字符串的方式:
$ python -c'导入系统;打印sys.argv''\ t'
['-c','\\ t']
请注意,您并没有真正将控制字符传递给Python,
您正在传递由\和t组成的两字符字符串. *什么时候
代表数据结构内的字符串,Python逃脱了\
避免与\ t这样的真实控制字符混淆.
如果您尝试打印字符串本身,您会发现一切都是
正确的:
$ python -c'导入系统;打印sys.argv [1]'\ t'
\ t
感谢您的答复,现在更清楚,还有一个问题.如何
我会将控制字符传递给命令行上的Python吗?
# 回答4


8月19日,晚上10:35,Wannymaho ...@gmail.com写道:
您正在输入一个由后斜切和一个组成的两个字节字符串
小写t,并将其喂给选择权.
C:\ junk> type test.py
进口系统; a = sys.argv [1]; d = {'分界符':a}
打印Len(a),a,str(a),reter(a)
打印d
#注意:这是窗口,壳报价为",而不是'
c:\ junk> python test.py" \ t"
2 \ t \ t'\\ t'
{'Delimiter':'\\ t'}
您看到的额外反闪烁是由(隐式)使用引起的
repl()显示字符串.
如果您需要/需要在命令行中输入字面标签字符,
请查阅手册.
hth,
约翰
# 回答5


Wannymahoots在周二,2008年8月19日05:35:27 -0700写道:
您正在误解证据.这是简短的解释:
Optparse不会逃脱控制角色,因为您不提供
它与 控制字符.您正在提供两个正常的
字符,仅 *看起来像五个(包括报价标记)
由于Python对后斜线的特殊处理.
如果需要,这是漫长的解释.
我对您的test.py文件进行了少量更改以证明:
#test.py(修改)
从optparse导入选项器
Parser = optionParser()
parser.add_option(" - d",dest ="定界符",action =" store")
(选项,args)= parser.parse_args()
打印"选项:",选项
打印" str of Options.delimiter =",str(options.delimiter)
打印" ofers.delimiter =",repr(options.delimiter)
打印" of ockess.delimiter =",len(options.delimiter)
这是我称之为的事情:
$ python test.py -d'\ t'
选项:{'DeLimiter':'\\ t'}
选项str.delimiter = \ t
repter.delimiter ='\\ t'
len选项.delimiter= 2
当您在命令行中传递'\ t'时,壳会发送字面
后斜线,然后是小写的python.也就是说,它发送了
字面字符串'\ t',而不是控制字符.
证明:使用" Echo"将相同的字符串传递给" WC"程序.别
忘记回声为字符串添加了一个新线:
$ ECHO'T'| wc#只是t
1 1 2
$ echo'\ t'| WC#A后斜线和T,而不是控制字符
1 1 3
那是难题的前半部分.现在下半年 - 为什么是Python
在Backslash-T中添加 *第二个 * Backslash?实际上,不是,但是
似乎 * *不仅添加了第二个后斜线,还要添加两个报价
分数.
Python中的后斜线很特别.如果您想要字面的后斜线
在Python字符串中,您必须键入 *两个 * Backslashes:
'\\ t'
因为单个后斜切,然后逃脱了t以制作一个标签
特点.
但是请注意,即使您输入了五个字符(引用,
Backslash,Backslash,t,Quote)Python创建了一个长度二的字符串:A
单个后斜线和t.
现在,当您使用str()函数打印某些内容时,Python隐藏了所有
您的复杂性.因此,看起来像这样的输出线:
选项str.delimiter = \ t
该论点是一个字面的后斜线,其次是t,而不是标签字符.
但是,当您使用repr()函数打印时,Python向您展示了您的内容
会输入 - 五个字符如下:
repter.delimiter ='\\ t'
但这只是两个字符字符串的 *显示 *.实际上
弦本身只有两个字符,尽管有两个引号和两个字符
后斜线.
现在,对于最终的难题:当您打印最合成的时候
对象,例如optparse值对象 - 在
您的代码 - python使用repr()而不是
str().
- -
史蒂文
# 回答6


感谢您的所有回应!
# 回答7


Dan Halligan 这取决于您使用的命令行.大多数类似Unix的外壳
将允许您通过使用 ^V之前输入控制字符.
由于\ t是标签字符,所以你 ULD能够像输入一样 这个: $ python -c'导入系统; 打印sys.argv''^v ' ['-c','\ t']#注意单次拒绝

标签: python

添加新评论