在python中从.ini文件读取特殊字符文本

在python中从.ini文件读取特殊字符文本,python,configparser,Python,Configparser,我正在运行一个脚本,该脚本包含一个文本“rAh%19u^l\&G”,即包含如图所示的特殊字符 当我将此文本作为参数传递到脚本中时,它运行良好,没有任何错误 示例-:/abc.py 上面的文字基本上是一个密码 现在,当我将值放入配置文件并读取上面的文本时,脚本失败 *******abc.ini******* [DEFAULT] username = rahul pwd = rAh%19u^l\&G 上面说 /bin/sh:M command not found. 在配置解析器的帮助下

我正在运行一个脚本,该脚本包含一个文本“rAh%19u^l\&G”,即包含如图所示的特殊字符

当我将此文本作为参数传递到脚本中时,它运行良好,没有任何错误

示例-:
/abc.py

上面的文字基本上是一个密码

现在,当我将值放入配置文件并读取上面的文本时,脚本失败

*******abc.ini*******

[DEFAULT]
username = rahul
pwd =  rAh%19u^l\&G
上面说

/bin/sh:M command not found.
在配置解析器的帮助下读取上述值

******下面是程序abc.py******

#! /usr/bin/python

parser = configparser.ConfigParser()
parser.read('abc.ini')
username = parser.get('DEFAULT','username')
pwd = parser.get('DEFAULT','pwd')


p = subprocess.Popen(
    "abc.py {0} {1}" .format(username, pwd), 
    shell=True, 
    stdout=subprocess.PIPE
)

out, err = p.communicate()

print(out)
我试着找了很多,但没有找到任何具体的东西


因此,问题是如何读取.ini文件中包含特殊字符的文本。

看起来这里的问题是
%
字符。如果您使用的是
ConfigParser
,则它具有特殊意义。如果不使用插值,则只使用
RawConfigParser
,否则必须将
%
加倍以转义

当我使用
ConfigParser
尝试示例文件时,它将爆炸,出现以下异常:

InterpolationSyntaxError: '%' must be followed by '%' or '(', found: '%19u^l\\&G"'
如果我将
ConfigParser
替换为
RawConfigParser
一切正常


你发布的错误与此无关。我们甚至不知道这是python异常还是shell错误消息。请用完整的错误消息更新您的问题。您还可以在
子流程

上添加一个更高级别的包装,以添加Paulo Scardine的评论

如果需要处理特殊字符,可以将
ConfigParser
interpolation
参数设置为
None
,这样就不会再有错误了<默认情况下,code>ConfigParser将
插值设置为
BasicInterpolation()

您可以在此处阅读更多关于此的信息:

此外,根据文档
RawConfigParser
是ConfigParser的一个
传统变体,默认情况下插值被禁用,并且不安全的add\u部分和set方法。

下面是其中的一个片段:

例如:

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures
在上面的示例中,插值设置为BasicInterpolation()的ConfigParser将
%(home\u dir)s
解析为
home\u dir
(在本例中为/Users)
%(my_dir)s
实际上将解析为
/Users/lumberjack
。[……]


当插值设置为
None
时,解析器只需返回
%(my_dir)s/Pictures
作为
my_Pictures
的值,返回
%(home_dir)s/lumberjack
作为
my_dir
的值,您可以用相同的字符转义特殊字符。例如,为了能够读取%,您必须将其写入%%

不要在问题中使用反勾号格式化代码。相反,缩进4个空格(带前导换行符)。您可以通过突出显示您的代码并按下顶部的
{}
按钮来自动执行此操作。您是否尝试过在
pwd=“rAh%19u^l\\&G”中引用它,或者在
pwd=“rAh%19u^l\\&G”中转义反斜杠
-btw,用户名和
pwd
的值是多少,你能在调用另一个脚本之前打印它们吗?@PauloScardine-我用反斜杠尝试了rAh%19u^l\\&G,但没有成功。我没有尝试引用它。但是,在引用时,它不会将引用也作为完整的文本??尝试一下,然后告诉我们…:-)@PauloScardine我诚挚的道歉将在下次发布问题时非常小心。正如建议的那样,“rAh%19u^l\&G”和pwd=“rAh%19u^l\&G”都不起作用。我将使用RawConfigParser,然后分享我的结果……非常感谢您的回答。这起作用了。我从上个星期开始搜索这个。RawConfigParser工作得很好。我们很高兴能为您服务,陛下。正如@Ativerc所提到的,它是“ConfigParser的一个遗留变体,默认情况下禁用插值,并且不安全的add_部分和set方法。”
parser=ConfigParser(interpolation=None)
如何使用单个引号
?我在文件夹名称中有一个撇号,但configparser似乎无法解析它