Вопрос по python – AttributeError: у объекта 'module' нет атрибута 'pydebug'

4

При попытке запустить скрипт Python я получаю сообщение об ошибкеAttributeError: 'module' object has no attribute 'pydebug', Я использую Python 2.6.

Полная ошибка:

File "/lib/python2.6/distutils/sysconfig.py", line 238, in get_makefile_filename
    return os.path.join(lib_dir, "config" + (sys.pydebug and "_d" or ""), "Makefile")
AttributeError: 'module' object has no attribute 'pydebug'
Какой у тебя код? Какая строка выдает исключение? David Robinson
Я обновил описание big
Это, скорее всего, не связано с реальным сценарием, так как sysconfig импортируется во время запуска интерпретатора перед загрузкой пользовательского сценария. Я получаю эту ошибку, когда запускаю все, что встраивает Python, что делает GDB на моем Ubuntu 12.04 непригодным для использования. Кажется, странная проблема с конфигурацией внутри дистрибутивных пакетов. Bluehorn
В будущем вы должны также предоставить сам фрагмент кода. Откуда вы взяли этот код? Вы сами не написали это? David Robinson

Ваш Ответ

4   ответа
2

что все, что вы пытаетесь запустить, ожидает использования специальной отладочной сборки python.sys.pydebug обычно не встречается в стандартном выпуске модуля sys, и я думаю, что он будет там, если вы создадите отладочный питон:

http: //docs.python.org/c-api/intro.html#debugging-build

Вполне возможно, что это также может быть частью конкретной сборки, которую используют дистрибутивы Debian / Ubuntu.

3

пытаясь запустить системный GDB Ubuntu 12.04.1 на питоне, который я собрал сам. Я ожидаю, что Ubuntu встроил некоторые хуки в систему gdb, чтобы использовать отладочную версию Python; но хуки не зацепляются ни за что в моем собственном питоне. Я справился с этим, создав собственный GDB и запустив его вместо этого.

Вот командная строка и полный возврат:

[email protected]:~/LSST/ip_diffim[master] $ gdb --args python tests/SnapPsfMatch.py 
Traceback (most recent call last):
  File "/usr/lib/python2.7/site.py", line 562, in <module>
    main()
  File "/usr/lib/python2.7/site.py", line 544, in main
    known_paths = addusersitepackages(known_paths)
  File "/usr/lib/python2.7/site.py", line 271, in addusersitepackages
    user_site = getusersitepackages()
  File "/usr/lib/python2.7/site.py", line 246, in getusersitepackages
    user_base = getuserbase() # this will also set USER_BASE
  File "/usr/lib/python2.7/site.py", line 236, in getuserbase
    USER_BASE = get_config_var('userbase')
  File "/usr/lib/python2.7/sysconfig.py", line 577, in get_config_var
    return get_config_vars().get(name)
  File "/usr/lib/python2.7/sysconfig.py", line 476, in get_config_vars
    _init_posix(_CONFIG_VARS)
  File "/usr/lib/python2.7/sysconfig.py", line 337, in _init_posix
    makefile = _get_makefile_filename()
  File "/usr/lib/python2.7/sysconfig.py", line 331, in _get_makefile_filename
    return os.path.join(get_path('platstdlib').replace("/usr/local","/usr",1), "config" + (sys.pydebug and "_d" or ""), "Makefile")
AttributeError: 'module' object has no attribute 'pydebug'

так что, похоже, он ищет неправильный питон (в/usr/lib) несмотря на то, что я сказал системе не делать этого:

[email protected]:~/LSST/ip_diffim[master] $ which python
/home/price/eups/Linux/python/2.7.2/bin/python
[email protected]:~/LSST/ip_diffim[master] $ echo $PYTHONPATH | grep usr
[email protected]:~/LSST/ip_diffim[master] $ 
Это, скорее всего, вызвано неправильным исполняемым файлом Python, лежащим на вашем пути. Я использовал strace, чтобы выяснить, какой из них (/usr/local/bin/python2.7 в моем случае), удалил его и попытался переустановить python. jrudolph
По моему опыту, опуская несистемный Pythonlib каталог отLD_LIBRARY_PATH избегает ошибки (конечно, это не позволяет присоединятьgdb к тому питону, работает толькоgdb сам по себе). Ioannis Filippidis
3

Я получаю сообщение об ошибке при запускеgdb в системе Ubuntu, где установлена альтернативная версия Python и предпочитает компоновщик. Вы можете проверить, происходит ли это в вашем случае, используяldd спросить, какие библиотекиgdb использует

# ldd $(which gdb)
...
        libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0 (0x00007ff75e044000)
...

Вы видите, что версия Python, выпущенная под брендом, работает в/usr/local/lib поставляетlibpython вgdb вместо официального Ubuntu Python в/usr/lib который вызывает ошибку - вне зависимости от того, что это за Pyth/usr/local не должен быть скомпилирован так же, как был скомпилирован Ubuntu Python, поэтому ожиданияgdb разочарованы.

Решение состоит в том, чтобы использовать среду для управления поведением компоновщика и сделать так, чтобы он предпочитал системуlibpython. Для хорошей меры я также сбрасываю свойPATH назад к чему-то совершенно стандартному. Я считаю, что это работает:

PATH=/bin:/usr/bin LD_LIBRARY_PATH=/usr/lib gdb ...
0

y» из установки Python на хосте, трассировка вызовов пытается получить значение «sys.pydebug».

$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more 
information.
>>> import sys
>>> sys.pydebug
False

Собственно построенный питон пропускает это.

HACK: заставить работать бинарники pyinstaller на Ubuntu-12.04. Ниже добавлено изменение кода в пользовательском Python, который возвращает ноль для "sys.pydebug".

$ diff -Naur Python/sysmodule-org.c Python/sysmodule.c
--- Python/sysmodule-org.c      2018-03-15 09:37:26.539515000 -0700
+++ Python/sysmodule.c  2018-03-15 19:58:34.503031000 -0700
@@ -1106,6 +1106,7 @@
maxunicode -- the largest supported character\n\
builtin_module_names -- tuple of module names built into this 
interpreter\n\
version -- the version of this interpreter as a string\n\
+pydebug -- always return zero\n\
version_info -- version information as a named tuple\n\
hexversion -- version information encoded as a single integer\n\
copyright -- copyright notice pertaining to this interpreter\n\
@@ -1420,6 +1421,8 @@

     SET_SYS_FROM_STRING("version",
                      PyString_FromString(Py_GetVersion()));
+    SET_SYS_FROM_STRING("pydebug",
+                         PyInt_FromLong(0));
     SET_SYS_FROM_STRING("hexversion",
                      PyInt_FromLong(PY_VERSION_HEX));
  svnversion_init();

Похожие вопросы