在Python的altinstall中安装Distribute
我在CentOS 5.8上安装Python 2.7.3的替代版本(altinstall),想要用distribute来安装pip等工具。不过,我对正确的操作流程有点困惑,而且distribute的安装脚本给我报错。
我现在的命令顺序是这样的:(最终会成为我项目的安装脚本)
sudo yum groupinstall "Development tools"
sudo yum install {zlib,bzip2,openssl,ncurses}-devel
cd /tmp && mkdir python273 && cd python273
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
tar -xf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure --prefix=/usr/local --enable-shared
make
sudo make altinstall # installs to /usr/local/{bin,lib}
# Fix path to shared lib - http://stackoverflow.com/a/7880519/1076493
echo "/usr/local/lib" | sudo tee -a /etc/ld.so.conf > /dev/null
sudo ldconfig
# Distribute
wget http://python-distribute.org/distribute_setup.py
sudo python2.7 distribute_setup.py
# Done, install whatever interesting packages I want + clean up
sudo pip install virtualenv yolk bpython
rm -rf /tmp/python273
但是在尝试运行distribute_setup.py
时,我遇到了"权限被拒绝"的错误,尽管我是用sudo来运行的。在root终端下运行是没问题的。我猜这个脚本在创建子进程时没有尊重最初使用的用户ID。
这让我想知道;在用distribute进行Python(2.7.3)的替代安装时,这个顺序是对的吗?还是说distribute的安装脚本根本不尊重给定的用户ID?如果问题出在脚本上,我该如何用sudo来运行它,因为我不想让我的安装需要root终端?
$ sudo python2.7 distribute_setup.py
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.35.tar.gz
Extracting in /tmp/tmpE9UJke
Now working in /tmp/tmpE9UJke/distribute-0.6.35
Installing Distribute
Traceback (most recent call last):
File "distribute_setup.py", line 546, in <module>
sys.exit(main())
File "distribute_setup.py", line 543, in main
return _install(tarball, _build_install_args(options))
File "distribute_setup.py", line 87, in _install
if not _python_cmd('setup.py', 'install', *install_args):
File "distribute_setup.py", line 37, in _python_cmd
return subprocess.call(args) == 0
File "/usr/local/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/local/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 13] Permission denied
1 个回答
8
我在RHEL5.8上有一个非常相似的设置,当我执行以下命令时,遇到了同样的权限拒绝的错误:
$ sudo python2.7 distribute_setup.py
这个问题可以通过使用绝对路径来解决:
$ sudo /usr/local/bin/python2.7 distribute_setup.py
根本的问题是,根账户的PATH中没有包含/usr/local/bin这个路径。
实际上,distribute_setup.py
试图通过重用当前的Python解释器来调用一个Python子命令,使用的是sys.executable和subprocess.call。如果你一步一步来试:
$ sudo python2.7 -c "import sys; print sys.executable"
$ sudo /usr/local/bin/python2.7 -c "import sys; print sys.executable"
/usr/local/bin/python2.7
权限拒绝的错误有点误导,但它是因为试图执行一个空的文件名导致的:
$ python2.7 -c "import subprocess; subprocess.call([''])"
[...]
OSError: [Errno 13] Permission denied