5

尝试运行 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'
4

4 回答 4

4

我在自己构建的 python 上尝试运行 Ubuntu 12.04.1 系统 gdb 时遇到了这个问题。我希望 Ubuntu 已经在系统 gdb 中构建了一些钩子,以便它使用 Python 的调试版本;但是这些钩子并没有抓住我自己的蟒蛇中的任何东西。我通过构建自己的 gdb 并运行它来解决这个问题。

这是命令行和完整的回溯:

price@neverland:~/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因此,尽管我已告诉系统不要这样做,但它似乎仍在寻找错误的 python (in ):

price@neverland:~/LSST/ip_diffim[master] $ which python
/home/price/eups/Linux/python/2.7.2/bin/python
price@neverland:~/LSST/ip_diffim[master] $ echo $PYTHONPATH | grep usr
price@neverland:~/LSST/ip_diffim[master] $ 
于 2012-09-14T17:52:25.593 回答
4

gdb在已安装 Python 的替代版本且链接器首选的 Ubuntu 系统上运行时,我收到错误消息。ldd您可以通过询问正在使用哪些库来验证您的情况是否发生了这种情况gdb

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

您可以看到运行的非品牌 Python 版本/usr/local/lib提供libpythongdb而不是导致错误的官方 Ubuntu Python /usr/lib— 无论它是在哪个非品牌 Python 中,/usr/local都不能以与 Ubuntu Python 相同的方式编译被编译了,所以期望gdb是失望的。

解决方案是使用环境来控制链接器的行为并使其更喜欢系统libpython。为了更好地衡量,我还将我的PATH背部重新设置为完全标准的东西。我发现这有效:

PATH=/bin:/usr/bin LD_LIBRARY_PATH=/usr/lib gdb ...
于 2015-09-29T14:45:31.497 回答
3

我认为无论您尝试运行什么,都希望与 python 的特殊调试版本一起使用。sys.pydebug通常不会在 sys 模块的标准版本中找到,我相信如果你构建了一个调试 python,它就会在那里:

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

这也可能是 Debian/Ubuntu 发行版正在使用的特定构建的一部分。

于 2012-05-17T19:49:58.853 回答
0

在 Ubunut-12.04 pyinstaller 构建的二进制文件中,从主机 python 安装调用“site.py”,调用跟踪试图获取“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

自定义构建的 python 缺少这个。

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();
于 2018-03-16T11:16:24.733 回答