configparser在Python 3.4,NoSectionError中不起作用,但在PyCharm中工作正常 [英] configparser not working in Python 3.4, NoSectionError but works fine in PyCharm

查看:133
本文介绍了configparser在Python 3.4,NoSectionError中不起作用,但在PyCharm中工作正常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在PyCharm 4.5中研究了Python 3.4脚本。 (回购: https://github.com/Djidiouf/bbot
在其中,我使用 import configparser 可以毫无问题地检索config.cfg中的某些值:

I worked on a Python 3.4 script in PyCharm 4.5. (repo: https://github.com/Djidiouf/bbot ) In it, I used import configparser without any problem for retrieving some values in a config.cfg:

config = configparser.RawConfigParser()
config.read('config.cfg')
server = config.get('bot_configuration', 'server')
channel = config.get('bot_configuration', 'channel')
botnick = config.get('bot_configuration', 'botnick')
port = config.getint('bot_configuration', 'port')

现在,我想将其部署在Debian 8.1服务器上。在该服务器上,我同时安装了Python 2.7和Python 3.4版本。

Now, I want to deploy it on a Debian 8.1 server. On that server, I have both Python 2.7 and Python 3.4 versions installed.

但是当我在计算机上运行脚本时,出现以下问题:

But when I ran the script on the machine, I have the following issue:

djidiouf@linuxserver:/home/djidiouf# /usr/bin/python3.4 /home/djidiouf/bbot/bbot.py
Traceback (most recent call last):
File "/usr/lib/python3.4/configparser.py", line 1116, in _unify_values
    sectiondict = self._sections[section]
KeyError: 'bot_configuration'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/djidiouf/bbot/bbot.py", line 25, in <module>
    import modules.steam  # Contains specific Steam-Valve related functions
File "/home/djidiouf/bbot/modules/steam.py", line 13, in <module>
    import modules.connection
File "/home/djidiouf/bbot/modules/connection.py", line 37, in <module>
    server = config.get('bot_configuration', 'server')
File "/usr/lib/python3.4/configparser.py", line 754, in get
    d = self._unify_values(section, vars)
File "/usr/lib/python3.4/configparser.py", line 1119, in _unify_values
    raise NoSectionError(section)
configparser.NoSectionError: No section: 'bot_configuration'

我在Internet上对此进行了大量研究,但没有找到任何东西有价值。有人提到损坏的config.cfg文件,但根据需要我的文件是带有UTF8且没有BOM的LF EOL文件。我也在机器上用vi重新创建了它。

I made a lot of research on Internet about that but I didn't find anything valuable. Some people made mention about a corrupt config.cfg file but mine is a LF EOL file with UTF8 without BOM as needed. I also recreated it again with vi on the machine.

我也尝试用pip安装configparser(即使我理解得很好,它现在已经内置在Python 3): pip3 install configparser 但是,当我这样做时,出现以下错误:

I also tried to install configparser with pip (even if, if I understand it well, it's now build-in in Python 3) : pip3 install configparser But when I do that, I have the following error:

djidiouf@linuxserver:/home/djidiouf# sudo pip3 install -v configparser
[sudo] password for djidiouf:
Downloading/unpacking configparser
Ignoring link https://pypi.python.org/packages/source/c/configparser/configparser-3.5.0b1.tar.gz#md5=d60ca2c714acb4adaf5818c6a1ffd78b (from https://pypi.python.org/simple/configparser/), version 3.5.0b1 is a pre-release (use --pre to allow).
Ignoring link https://pypi.python.org/packages/source/c/configparser/configparser-3.5.0b2.tar.gz#md5=ad2a71db8bd9a017ed4735eac7acfa07 (from https://pypi.python.org/simple/configparser/), version 3.5.0b2 is a pre-release (use --pre to allow).
Using version 3.3.0r2 (newest of versions: 3.3.0r2, 3.3.0r1, 3.2.0r3, 3.2.0r2, 3.2.0r1)
Downloading configparser-3.3.0r2.tar.gz
Downloading from URL https://pypi.python.org/packages/source/c/configparser/configparser-3.3.0r2.tar.gz#md5=dda0e6a43e9d8767b36d10f1e6770f09 (from https://pypi.python.org/simple/configparser/)
Running setup.py (path:/tmp/pip-build-v7av3db7/configparser/setup.py) egg_info for package configparser
    Traceback (most recent call last):
    File "<string>", line 3, in <module>
    File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 5, in <module>
        import distutils.core
    File "/usr/lib/python3.4/distutils/core.py", line 18, in <module>
        from distutils.config import PyPIRCCommand
    File "/usr/lib/python3.4/distutils/config.py", line 7, in <module>
        from configparser import ConfigParser
    File "/tmp/pip-build-v7av3db7/configparser/configparser.py", line 397
        _KEYCRE = re.compile(ur"%\(([^)]+)\)s")
                                            ^
    SyntaxError: invalid syntax
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):

File "<string>", line 3, in <module>

File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 5, in <module>

    import distutils.core

File "/usr/lib/python3.4/distutils/core.py", line 18, in <module>

    from distutils.config import PyPIRCCommand

File "/usr/lib/python3.4/distutils/config.py", line 7, in <module>

    from configparser import ConfigParser

File "/tmp/pip-build-v7av3db7/configparser/configparser.py", line 397

    _KEYCRE = re.compile(ur"%\(([^)]+)\)s")

                                        ^

SyntaxError: invalid syntax

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-v7av3db7/configparser
Exception information:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
File "/usr/lib/python3/dist-packages/pip/commands/install.py", line 290, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File "/usr/lib/python3/dist-packages/pip/req.py", line 1230, in prepare_files
    req_to_install.run_egg_info()
File "/usr/lib/python3/dist-packages/pip/req.py", line 326, in run_egg_info
    command_desc='python setup.py egg_info')
File "/usr/lib/python3/dist-packages/pip/util.py", line 716, in call_subprocess
    % (command_desc, proc.returncode, cwd))
pip.exceptions.InstallationError: Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-v7av3db7/configparser

Storing debug log for failure in /root/.pip/pip.log

这里是一个配置示例,我只是更改了值并将文件相应地重命名为config.cfg:

Here is a config example, I just changed the values and rename the file accordingly to config.cfg :

[bot_configuration]
server = your.irc.server.com
channel = ##your_channel
botnick = bbot
port = 6667
admins = You,Him

https://github.com/Djidiouf/bbot/blob/master/config_example.cfg

最后,我只想说一切都在使用PyCharm 4.5,我刚刚做了一个 git克隆,重命名了config_example.cfg,更改了值,尝试使用Python 3.4运行该脚本。

Finally, I just want to say that everything is working on PyCharm 4.5, I just made a git clone, rename the config_example.cfg, change the values, tried to run the script with Python 3.4.

推荐答案

我发现我在运行脚本方面存在一些不一致之处。当我将脚本放在另一个文件夹中时,什么也没有起作用,但是当我在其中时,它就起作用了。可能是因为配置文件是在主脚本和模块中共享和使用的。
实际上,这是由于需要在 config.read('/ some / path / file.cfg')

I figured out that I had some inconsistency about running the script. When I was in another folder than my script, nothing worked but when I was in it, it worked. Perhaps because the config file is shared and used in the main script and in a module. In fact it's due to the need to have an absolute path in config.read('/some/path/file.cfg')

最后,我找到了答案: https://stackoverflow.com/a/13800583/3301370

Finally, I find that answer: https://stackoverflow.com/a/13800583/3301370

因此,这是config.cfg位于项目根目录 /config.cfg :

So here is the solution in the case of config.cfg being on the project root directory /config.cfg :

/bbot.py

import os
config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'config.cfg'))

但是,由于配置文件是在主脚本以及子路径模块中共享和使用的,因此子模块也必须设置正确的路径:

However, as the config file is shared and used in the main script and in a subpath, module, a correct path must be set for the sub module too:

/modules/connection.py

import os
config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', 'config.cfg'))

在PyCharm中工作正常,因为当您点击脚本的运行按钮,它将与项目路径一起运行。对于这两个 config.read()语句都具有相对路径的事实仅是因为这个原因。

It works fine in PyCharm because when you hit the run button for your script, it runs it with the path of the project. The fact that having a relative path for both config.read() statements worked only because of that.

用pip安装configparser的问题与该特定问题无关,在这种情况下可以忽略,因为configparser是Python3中的内置库。

The problem with installing configparser with pip is unrelated to that specific problem and can be ignore in that case as configparser is a built-in library in Python3.

这篇关于configparser在Python 3.4,NoSectionError中不起作用,但在PyCharm中工作正常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆