4

私は CentOS 5.8 で Python 2.7.3 の altinstall を実行しています。配布したいのは、pip とすべてのジャズを提供するものです。しかし、正しい手順を理解するのに苦労しており、配布用のセットアップ スクリプトでエラーが発生しています。

コマンドの現在の順序: (最終的には、私のプロジェクトに使用されるセットアップ スクリプトになります)

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

ただし、sudoで実行しているにもかかわらず、実行しようとすると「許可が拒否されました」と表示されます。distribute_setup.pyルートシェルで実行すると問題なく動作します。スクリプトは、サブプロセスなどを作成するときに最初に使用された UID を尊重していないと思います。

これは不思議に思います。配布を使用して Python (2.7.3) の altinstall を実行する場合、これは正しい順序ですか? それとも、配布セットアップ スクリプトが指定された UID を尊重していないだけですか? スクリプトに問題がある場合、セットアップに root シェルを要求したくないので、どうすれば sudo でスクリプトを実行できますか?

$ 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
4

1 に答える 1

8

ここでは RHEL5.8 で非常によく似た設定を行っていますが、実行すると同じアクセス許可拒否の例外が発生します。

$ sudo python2.7 distribute_setup.py

この問題は、絶対パスを使用して解決されます。

$ sudo /usr/local/bin/python2.7 distribute_setup.py

根本的な問題は、root アカウントの PATH に /usr/local/bin が含まれていないことです。


Indeedは、現在の python インタープリターをsys.executableおよびsubprocess.calldistribute_setup.pyで再利用することにより、python サブコマンドを呼び出そうとします。

$ 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
于 2013-04-26T15:03:51.830 に答える