安装Python加密模块出现错误

4
当我运行pip install cryptography时,我得到以下结果。
pip install cryptography
Downloading/unpacking cryptography
Running setup.py egg_info for package cryptography
Traceback (most recent call last):
  File "<string>", line 16, in <module>
  File "/tmp/pip-build-root/cryptography/setup.py", line 174, in <module>
    "test": PyTest,
  File "/usr/lib64/python2.6/distutils/core.py", line 152, in setup
    dist.run_commands()
  File "/usr/lib64/python2.6/distutils/dist.py", line 975, in run_commands
    self.run_command(cmd)
  File "/usr/lib64/python2.6/distutils/dist.py", line 995, in run_command
    cmd_obj.run()
  File "<string>", line 14, in replacement_run
  File "/usr/lib/python2.6/site-packages/setuptools/command/egg_info.py", line 254, in find_sources
    mm.run()
  File "/usr/lib/python2.6/site-packages/setuptools/command/egg_info.py", line 308, in run
    self.add_defaults()
  File "/usr/lib/python2.6/site-packages/setuptools/command/egg_info.py", line 332, in add_defaults
    sdist.add_defaults(self)
  File "/usr/lib/python2.6/site-packages/setuptools/command/sdist.py", line 187, in add_defaults
    build_py = self.get_finalized_command('build_py')
  File "/usr/lib64/python2.6/distutils/cmd.py", line 319, in get_finalized_command
    cmd_obj.ensure_finalized()
  File "/usr/lib64/python2.6/distutils/cmd.py", line 117, in ensure_finalized
    self.finalize_options()
  File "/usr/lib/python2.6/site-packages/setuptools/command/build_py.py", line 61, in finalize_options
    _build_py.finalize_options(self)
  File "/usr/lib64/python2.6/distutils/command/build_py.py", line 50, in finalize_options
    ('force', 'force'))
  File "/usr/lib64/python2.6/distutils/cmd.py", line 305, in set_undefined_options
    src_cmd_obj.ensure_finalized()
  File "/usr/lib64/python2.6/distutils/cmd.py", line 117, in ensure_finalized
    self.finalize_options()
  File "/tmp/pip-build-root/cryptography/setup.py", line 88, in finalize_options
    self.distribution.ext_modules = get_ext_modules()
  File "/tmp/pip-build-root/cryptography/setup.py", line 65, in get_ext_modules
    from cryptography.hazmat.primitives import constant_time, padding
  File "cryptography/hazmat/primitives/constant_time.py", line 49, in <module>
    _ffi = cffi.FFI()
  File "/tmp/pip-build-root/cryptography/cffi-0.8.6-py2.6-linux-x86_64.egg/cffi/api.py", line 56, in __init__
    import _cffi_backend as backend
ImportError: /tmp/pip-build-root/cryptography/cffi-0.8.6-py2.6-linux-x86_64.egg/_cffi_backend.so: failed to map segment from shared object: Operation not permitted
Complete output from command python setup.py egg_info:
running egg_info

writing requirements to pip-egg-info/cryptography.egg-info/requires.txt

writing pip-egg-info/cryptography.egg-info/PKG-INFO

writing top-level names to pip-egg-info/cryptography.egg-info/top_level.txt

writing dependency_links to pip-egg-info/cryptography.egg-info/dependency_links.txt

warning: manifest_maker: standard file '-c' not found

Traceback (most recent call last):

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

  File "/tmp/pip-build-root/cryptography/setup.py", line 174, in <module>

    "test": PyTest,

  File "/usr/lib64/python2.6/distutils/core.py", line 152, in setup

    dist.run_commands()

  File "/usr/lib64/python2.6/distutils/dist.py", line 975, in run_commands

    self.run_command(cmd)

  File "/usr/lib64/python2.6/distutils/dist.py", line 995, in run_command

    cmd_obj.run()

  File "<string>", line 14, in replacement_run

  File "/usr/lib/python2.6/site-packages/setuptools/command/egg_info.py", line 254, in find_sources

    mm.run()

  File "/usr/lib/python2.6/site-packages/setuptools/command/egg_info.py", line 308, in run

    self.add_defaults()

  File "/usr/lib/python2.6/site-packages/setuptools/command/egg_info.py", line 332, in add_defaults

    sdist.add_defaults(self)

  File "/usr/lib/python2.6/site-packages/setuptools/command/sdist.py", line 187, in add_defaults

    build_py = self.get_finalized_command('build_py')

  File "/usr/lib64/python2.6/distutils/cmd.py", line 319, in get_finalized_command

    cmd_obj.ensure_finalized()

  File "/usr/lib64/python2.6/distutils/cmd.py", line 117, in ensure_finalized

    self.finalize_options()

  File "/usr/lib/python2.6/site-packages/setuptools/command/build_py.py", line 61, in finalize_options

    _build_py.finalize_options(self)

  File "/usr/lib64/python2.6/distutils/command/build_py.py", line 50, in finalize_options

    ('force', 'force'))

  File "/usr/lib64/python2.6/distutils/cmd.py", line 305, in set_undefined_options

    src_cmd_obj.ensure_finalized()

  File "/usr/lib64/python2.6/distutils/cmd.py", line 117, in ensure_finalized

    self.finalize_options()

  File "/tmp/pip-build-root/cryptography/setup.py", line 88, in finalize_options

    self.distribution.ext_modules = get_ext_modules()

  File "/tmp/pip-build-root/cryptography/setup.py", line 65, in get_ext_modules

    from cryptography.hazmat.primitives import constant_time, padding

  File "cryptography/hazmat/primitives/constant_time.py", line 49, in <module>

     _ffi = cffi.FFI()

  File "/tmp/pip-build-root/cryptography/cffi-0.8.6-py2.6-linux-x86_64.egg/cffi/api.py", line 56, in  __init__

    import _cffi_backend as backend

ImportError: /tmp/pip-build-root/cryptography/cffi-0.8.6-py2.6-linux-x86_64.egg/_cffi_backend.so: failed to map segment from shared object: Operation not permitted

----------------------------------------
Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-root/cryptography
Storing complete log in /root/.pip/pip.log

我猜测我缺少一些依赖包?

当我运行 sudo yum install gcc libffi-devel python-devel openssl-devel 来安装所需的依赖包时,我得到了以下结果:

sudo yum install gcc libffi-devel python-devel openssl-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.econdc.com
 * epel: mirrors.coreix.net
 * extras: centos.hyve.com
 * updates: mirror.sov.uk.goscomb.net
Setting up Install Process
Package gcc-4.4.7-4.el6.x86_64 already installed and latest version
Package libffi-devel-3.0.5-3.2.el6.x86_64 already installed and latest version
Package python-devel-2.6.6-52.el6.x86_64 already installed and latest version
Package openssl-devel-1.0.1e-16.el6_5.15.x86_64 already installed and latest version
Nothing to do

有人对我缺少什么有什么建议吗?这与IT技术有关。请帮我检查一下,谢谢。请勿删除HTML标签。

“failed to map segment from shared object: Operation not permitted” 意味着在 cffi 编译期间创建的临时共享对象不允许被读取。据说在某些情况下,这可能是由于 SELinux 引起的,但我从未亲眼见过。您使用的是哪个发行版? - Paul Kehrer
这个问题有任何更新吗?我也遇到了同样的问题,CentOS 6.4。 - lbrandao
这个Ubuntu Debian解决方案对我有用。https://dev59.com/k-o6XIcBkEYKwwoYKQ_G - dubis
4个回答

8

使用 pip 命令进行安装时,不需要进行 /tmp 的 Chroot 和重新挂载操作,因为 pip 自带这个选项(pip help install):

-b, --build <dir>    Directory to unpack packages into and build in.

只需将其设置为没有noexec的目录即可。


我在一个共享服务器上,无法更改挂载标志。感谢您指出这一点! - melissa_boiko

1
在某些系统上,这应该可以工作:

On some systems, this should work:

TMPDIR=~/tmp pip install cryptography

1
我遇到了同样的问题,原因是服务器上/tmp没有执行权限。这导致了各种问题。解决方法是创建一个“chroot”环境,其中包含一个允许文件执行的“/tmp”目录:
请参考this article中的说明来解决此问题。
  1. 创建一个“chroot”环境,其中包含允许文件执行的“/tmp”目录:

    mkdir -p /root/chroot /root/tmp
    mount --bind / /root/chroot
    mount --bind /root/tmp /root/chroot/tmp
    chroot /root/chroot

  2. 进入您创建的“chroot”环境:

    chroot /root/chroot

  3. 此时,您已经在“chroot”环境中,可以运行任何需要的命令。

    运行安装程序

  4. 完成后,请输入以下命令:

    exit

    umount -l /root/chroot


0

你也可以在没有noexec标志的情况下挂载该卷,方法是从/etc/fstab中删除它或执行mount -o remount exec /tmp命令。

fstab解决方案不够安全,因为任何人都可以将脚本放在/tmp目录下并执行它们。

更多信息请点击此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接