我正在编写与Python 2.7.13
和Python 3.3
兼容的软件包,并使用以下内容:
try:
import configparser
except:
from six.moves import configparser
但是当我在.gitmodules
上加载Python 2.7
文件时:
configParser = configparser.RawConfigParser( allow_no_value=True )
configFilePath = os.path.join( current_directory, '.gitmodules' )
configParser.read( configFilePath )
抛出错误:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "update.py", line 122, in run
self.create_backstroke_pulls()
File "update.py", line 132, in create_backstroke_pulls
configParser.read( configFilePath )
File "/usr/lib/python2.7/ConfigParser.py", line 305, in read
self._read(fp, filename)
File "/usr/lib/python2.7/ConfigParser.py", line 546, in _read
raise e
ParsingError: File contains parsing errors: /cygdrive/d/.gitmodules
[line 2]: '\tpath = .versioning\n'
[line 3]: '\turl = https://github.com/user/repo\n'
但是如果我从.gitmodules
文件中删除标签,它就能正常工作。在Python 3.3
上它可以使用标签,仅在Python 2.7.13
上使用标签。如何在不删除标签的情况下使其工作?
当我添加新的子模块时,git
本地放置了标签,所以我绝对不会将它们从原始文件中删除。我一直在想我可以复制文件,同时删除标签。但与Python
兼容的操作成本是否较低?
相关问题:
答案 0 :(得分:2)
解决方法是使用带有修改内容的io.StringIO
传递给readfp
(它接受文件句柄而不是文件名)。
以下代码试图遵循Python 2和Python 3(即使在python 3中,readfp
已被弃用,现在它是read_file
。无论如何它仍然有效。请注意,我不需要six
个包,configparser
本身存在于2& 3个python版本。
try:
import ConfigParser as configparser
except ImportError:
import configparser
import io
try:
unicode
except NameError:
unicode = str # python 3: no more unicode
r = configparser.RawConfigParser()
with open(configFilePath) as f:
fakefile = io.StringIO(unicode(f.read().replace("\t","")))
r.readfp(fakefile,filename=configFilePath)
因此,通过使用filecontents减去标签来读取伪文件,“解析”了解析器。