2015-08-21 2 views
2

Я работал над скриптом Python 3.4 в PyCharm 4.5. (РЕПО: https://github.com/Djidiouf/bbot) В нем я использовал import configparser без каких-либо проблем для получения некоторых значений в config.cfg:configparser не работает в Python 3.4, NoSectionError, но отлично работает в PyCharm

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') 

Теперь я хочу, чтобы развернуть его на сервере 8.1 Debian. На этом сервере у меня установлены версии Python 2.7 и Python 3.4.

Но когда я запускал скрипт на машине, у меня следующий вопрос:

[email protected]:/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' 

Я сделал много исследований в Интернете об этом, но я не нашел ничего ценного. Некоторые люди упоминали о поврежденном файле config.cfg, но мой файл LF EOL с UTF8 без спецификации по необходимости. Я также снова воссоздал его с помощью vi на машине.

Я также попытался установить ConfigParser с пип (даже если, если я понимаю, это хорошо, это теперь встраиваться в Python 3): pip3 install configparser Но когда я делаю это, у меня есть следующее сообщение об ошибке:

[email protected]:/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:

[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

Fi Я просто хочу сказать, что все работает на PyCharm 4.5, я только что сделал git clone, переименуйте config_example.cfg, измените значения, попытался запустить скрипт с Python 3.4.

ответ

0

я понял, что я имел некоторую несогласованность о запуске сценария. Когда я был в другой папке, чем в моем скрипте, ничего не сработало, но когда я был в ней, это сработало. Возможно, потому, что файл конфигурации является общим и используется в основном скрипте и в модуле. На самом деле это связано с необходимостью иметь абсолютный путь в config.read('/some/path/file.cfg')

Наконец, я считаю, что ответ: https://stackoverflow.com/a/13800583/3301370


Так вот решение в случае config.cfg быть на проекте корневой каталог /config.cfg

/bbot.ру

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

Однако, как конфигурационный файл разделяется и используется в основном скрипте и в подпути, модуль, правильный путь должен быть установлен модуль к югу также:

/модули/connection.py

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

он отлично работает в PyCharm, потому что, когда вы нажмете кнопку запуска для вашего сценария, он запускает его на пути реализации проекта. Тот факт, что относительный путь для обоих операторов config.read() работал только из-за этого.

Проблема с установкой configparser with pip не связана с этой конкретной проблемой и может быть проигнорирована в этом случае, поскольку configparser является встроенной библиотекой в ​​Python3.

+0

* ваш файл конфигурации не найден, передайте полный путь, и я уверен, что он будет работать * –

1

Ошибка установки от _KEYCRE = re.compile(ur"%\(([^)]+)\)s"), что вызывает синтаксическую ошибку, поскольку префикс ur не поддерживается в python3, pip пытается установить пакет python2.

Ваша первая ошибка - keyError 'bot_configuration', которая не из-за того, что не установлен configparser, configparser является частью стандартной библиотеки.

The bot_configurationKeyError потому, что питон не может найти файл конфигурации, если вы используете config.read('foobar') в PyCharm вы увидите точно такой же вывод

+0

В PyCharm, где я разработал свой сценарий, мой интерпретатор python - это 3.4.3 без каких-либо сомнений. – Djidiouf

+0

@Djidiouf, именно это моя точка, 'ur' не поддерживается в python3, это должно быть просто' r' –

+0

Можете ли вы уточнить, что происходит в моем коде или моей настройке, и почему он хорошо работает на PyCharm а не на моем сервере? – Djidiouf