ImportError:使用LXML时拒绝权限

时间:2013-06-13 04:51:14

标签: python permissions lxml importerror denied

使用Easy_Install-2.7从https://pypi.python.org/pypi/lxml/3.2.1安装LXML后,我遇到了很多麻烦。我使用cygwin在Windows上安装它,起初包装似乎没问题。然而,经过进一步测试,我遇到了问题。

当我使用以下代码运行代码时

import lxml

它完全正常。但是一旦我尝试:

import lxml.etree

我收到此错误:

Traceback (most recent call last):
  File "D:\Nick_Code\NewsScraper\testdummy.py", line 7, in <module>
    import lxml.etree
  File "/usr/lib/python2.7/site-packages/lxml-3.2.0-py2.7-cygwin-1.7.20-i686.egg/lxml/etree.py", line 7, in <module>
    __bootstrap__()
  File "/usr/lib/python2.7/site-packages/lxml-3.2.0-py2.7-cygwin-1.7.20-i686.egg/lxml/etree.py", line 6, in __bootstrap__
    imp.load_dynamic(__name__,__file__)
ImportError: Permission denied

我一直试图找到信息/工作很长一段时间但没有成功。如果您有任何见解或需要信息,请与我们联系。

谢谢!

迈克尔

1 个答案:

答案 0 :(得分:3)

这不是一个可靠的答案。但我将重点介绍获得解决方案所涉及的几个问题。最有可能是上述问题,就像是由几个因素共同造成的癌症造成的。

当我尝试在我的Windows Vista计算机上使用本机Cygwin提供的Python软件包时,我遇到与OP相同的问题。作为Python新手,我花了几天时间试图让它工作,并理解它为什么不起作用。但我所有的谷歌都没有返回任何死胡同。所以这就是我对此的看法。

有很多原因导致Python在Cygwin下遇到麻烦,有些是你可以做些什么,有些是超出大多数人控制的。归结为以下几个关键问题:

  1. 在文件权限方面,Windows是一个完整的混乱,Cygwin无法很好地处理Windows文件权限。所以你在Cygwin看到的远不是整个故事。

  2. Windows可耻地与字符大小写无关,这会导致很多麻烦,特别是当您需要(交叉)编译最初在基于* nix的系统(即所有内容)下开发的任何内容时。实际上,如果您尝试提取包含名称仅以大写形式不同的文件的任何存档。 (即#34; makefile &#34; vs&#34; Makefile &#34;等等)Windows或Cygwin下的文件,除了其中一个文件。如果他们你需要使用区分大小写来做除了#34; hello world&#34;之外的任何事情。 * nix汇编。

  3. Windows处理与Cygwin完全不同的符号链接。如果您的ZIP,TAR等档案包含任何符号链接,它们将在提取到Windows环境后被破坏。

  4. 软件代码实践,开发人员未在各种环境中正确测试其创建,或仔细设置其*.tar.gz集合的正确文件权限。包括正确的依赖规范,或提及二进制文件是否已静态链接等。

  5. 有关完整的血腥细节和进一步(Win-Cygwin)问题,请查看HERE

    起初我尝试使用Cygwin自己的Python,没有任何额外的软件包,并使用PIP和easy_install安装lxml。然后我尝试使用Cygwin自己的libxml2,libxslt和xml python包,我遇到了同样的问题。

    首先,安装静态Windows二进制文件后(如其他地方所示), 我收到了这个错误:

    File "/usr/lib/python2.7/site-packages/lxml-3.2.4-py2.7-cygwin-1.7.24-i686.egg/lxml/etree.py", line 6, in __bootstrap__
        imp.load_dynamic(__name__,__file__)
    ImportError: Permission denied
    Aborted (core dumped)
    

    然后我调查了文件权限并更改了:chmod -R 755 /usr/lib/python2.7/

    我进一步将问题隔离到一个明显丢失的文件。 并且启用详细和诊断模式也没有多大帮助。

    File "/usr/lib/python2.7/site-packages/lxml-3.2.4-py2.7-cygwin-1.7.24-i686.egg/lxml/etree.py", line 6, in __bootstrap__
        imp.load_dynamic(__name__,__file__)
    ImportError: No such file or directory
    Aborted (core dumped)
    

    HERE是确切的声明规范:

      

    加载并初始化一个实现为动态可加载共享的模块   库并返回其模块对象。如果模块已经初始化,那么   将再次初始化。重新初始化涉及复制__dict__   模块的缓存实例的属性超过模块中使用的值   缓存在 sys.modules 中。 pathname参数必须指向共享库。   name参数用于构造初始化函数的名称:   调用共享库中名为 initname()的外部C函数。该   可选的文件参数被忽略。 (注意:使用共享库非常重要   系统依赖,并非所有系统都支持它。)

    所以我开始阅读lxml website,它清楚地说明lxml对 libxml2 libxslt 的依赖关系,除非它们是静态链接的,他们还依赖于iconv和zlib。因此,您必须相信您需要安装所有这些。唐&#39;吨!继续阅读。但是如果您要从源代码构建(就像easy_install可能会尝试做的那样),您将需要一切,包括开发头库: libxml2-devel,libxslt-devel 。另一个地方声明你还需要 Cython 并安装:

    easy_install lxml==dev 
    

    依赖关系显示在HERE的这张图片中:

    libxml dependecies

    所以你认为你可能会逃避:

    STATIC_DEPS=true pip install lxml
    

    但那也不行。可能是因为用于编译Cygwin的Python的库必须与编译lxml的库相同。但我不知道。请注意lxml包如何引用Cygwin &#34; 1.7.24&#34; 。我的Cygwin已经&#34; 1.7.25&#34; ,您可以使用uname -a进行检查。然后,您可以使用fileldd检查静态python可执行文件。然后你就会明白这也取决于用于在Windows或* nix下构建python / cygwin的C编译器。嗅到一场噩梦,我决定建立自己的噩梦是不可能的。接下来我尝试安装Python库(提供为 可执行文件)适用于Windows Python。这没有用,因为我从来没有安装过Windows原生Python,我遇到了一个错误,安装程序无法在我的注册表中找到Python。我当然可以提取可执行文件,但我不知道在没有安装程序的情况下放置二进制文件的位置。所以我有另一个想法......

    据我所见,有三种可能的解决方案可以让它发挥作用。

    1. 安装Windows本机Python解释器的简便方法。你放弃了一些原生的Cygwin功能,除非你安装在正确的位置:/usr/lib/python2.7并确保Cygwin可以找到并使用它。这也使用与Cygwin(UTF-8)不同的文件权限,区分大小写和字符集(UTF-16LE),可能会产生许多其他问题! 难度:容易

    2. 继续攻击Cygwin的Python,使其与(1)中使用的二进制库一起使用。但这需要:

      • a)卸载并删除所有Cygwin Python软件包,但裸Python解释器除外。
      • b)删除所有PIP和简易安装跟踪。
      • c)攻击Windows注册表以假装安装了Python27:
      • HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ InstallPath C:\ Python27 \
      • HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ PythonPath C:\ Python27 \ Lib; C:\ Python27 \ DLLs; C:\ Python27 \ Lib \ lib-tk
      • HKEY_CLASSES_ROOT ...
      • d)安装Windows二进制库。
      • e)现在所有其余部分应该可以使用PIP或easy_install。 难度:中等!
    3. 通过从头开始编译Python和所有库来正确地完成它。 难度:难!

    4. 我成功地做了(1),但我仍然认为(2)是更聪明的方式,但我没有测试过,这就是为什么我不认为这是一个好的答案。 BTW。还有一个怪癖,我必须运行解释器:python.exe -E以避免烦人:&#34; 语法错误:语法无效 &#34;什么时候回来!

      结论:

      显然,你不需要libxml2和libxslt python包来使用lxml! 在我的情况下,我需要Scrapy,所以我还必须安装一些其他软件包。

      $ pip.exe list
      cssselect (0.9.1)
      lxml (3.2.4)
      pip (1.4.1)
      pyOpenSSL (0.11)
      pywin32 (218)
      queuelib (1.1.1)
      Scrapy (0.20.0)
      setuptools (1.4.1)
      six (1.4.1)
      Twisted (13.2.0)
      w3lib (1.5)
      zope.interface (4.0.5)
      
      
      $ll /cygdrive/c/Python27/Lib/site-packages/
      adodbapi
      cssselect
      isapi
      lxml
      OpenSSL
      pip
      pythonwin
      pywin32_system32
      queuelib
      scrapy
      twisted
      w3lib
      win32
      win32com
      win32comext
      zope
      cssselect-0.9.1-py2.7.egg-info
      lxml-3.2.4-py2.7.egg-info
      pip-1.4.1-py2.7.egg-info
      queuelib-1.1.1-py2.7.egg-info
      Scrapy-0.20.0-py2.7.egg-info
      six-1.4.1-py2.7.egg-info
      Twisted-13.2.0-py2.7.egg-info
      w3lib-1.5-py2.7.egg-info
      zope.interface-4.0.5-py2.7.egg-info
      PyWin32.chm
      setuptools-1.4.1-py2.7.egg
      pyOpenSSL-0.11-py2.7.egg-info
      pywin32-218-py2.7.egg-info
      easy-install.pth
      pywin32.pth
      setuptools.pth
      zope.interface-4.0.5-py2.7-nspkg.pth
      pythoncom.py
      six.py
      pythoncom.pyc
      six.pyc
      pythoncom.pyo
      pywin32.version.txt
      README.txt
      

      有用的参考资料: