在没有root权限的情况下安装Python 2.7

10

我尝试在远程Linux机器上以非root用户身份安装Python 2.7。 我运行了以下命令:

./configure prefix=/  
make install DESTDIR=/xxx/yyy/ 

/xxx/yyy/是我拥有读写权限的目录。

最后我遇到了一个问题,它说:

使用gdbm构建dbm时的信息:找不到Tcl/Tk库和/或头文件

Python构建完成,但构建这些模块所需的必要部分未被发现: _tkinter bsddb185 dl imageop sunaudiodev 若要查找必要的部分,请在detect_modules()中查看setup.py并查找该模块的名称。

运行build_scripts运行install_lib创建/lib/python2.7时出错:无法创建' /lib/python2.7':权限被拒绝

我是否正确地在没有root访问权限的情况下安装它?(即我的configure和make命令?)有人能告诉我为什么它无法正确安装吗?

谢谢,
ktm

5个回答

15

我刚刚在没有管理员权限的情况下安装了Python 2.7.5。我认为命令应该是:

./configure prefix=/xxx/yyy
make install

然后您应该在 .bashrc 中添加路径 /xxx/yyy/bin,如下所示:

PYTHONPATH=/home/songmeixu/python/bin
export PATH=$PYTHONPATH:$PATH

10
你应该设置前缀为 /xxx/yyy。如果前缀是 /,它会将库安装到 /lib/python2.7 路径下,而不是 /xxx/yyy/lib/python2.7。

我做了这件事,但它把bin/share/lib文件安装在/xxx/yyy/xxx/yyy中。最终,我重命名了路径,以反映我想要的目录结构(肯定不是那个冗余的路径!),希望它不会引起路径冲突。 - ktm5124
3
@ktm5124:如果已经配置了 prefix,就不需要提供 DESTDIR。事实上,用户根本不需要使用 DESTDIR - Rufflewind

4

为什么不是每个人都这样做呢?有什么陷阱吗? - Gabriel Fair
2
@GabrielFair - 社区许可证有一定的限制...请参见http://www.activestate.com/activepython/license-agreement - Sridhar Ratnakumar
1
这很简单!而且使用 pip,我安装了所有我需要的包。 - Yin Zhu
看起来他们没有提供最新版本。在撰写本文时,AS提供的是3.4.1,而最新版本是3.4.3。 - hilcharge
如果您需要标准构建并且已为您的平台提供预编译的二进制文件,则这是一个不错的解决方案;但答案可能应该概述这不是您所需时的情况(即找不到特定平台的二进制文件;或出于某些原因需要自定义构建,例如需要比可用的预编译二进制文件更新的版本)。 - tripleee

2
我写了一个脚本,用于在用户目录中安装Python 2(缺少Python 3为用户安装提供的便利设施)和Pip 2,以便标准用户可以成为其模块等的管理员。"最初的回答"
#!/bin/bash
VERSION="2.7.11"
BUILDDIR=~/"build/python"
INSTALLDIR=~/"python/Python-$VERSION"

mkdir -p ${BUILDDIR}
cd ${BUILDDIR}
if [ ! -f $BUILDDIR/Python-$VERSION.tgz ]
then
wget https://www.python.org/ftp/python/$VERSION/Python-$VERSION.tgz
tar zxfv Python-$VERSION.tgz
fi
find $BUILDDIR -type d | xargs chmod 0755
cd Python-$VERSION


mkdir -p ${INSTALLDIR}
./configure --prefix=${INSTALLDIR}
make && make install

# Append to user PATH or create symbolic link to .local/bin
# [[ ":$PATH:" != *":$HOME/python/Python-$VERSION/bin:"* ]] && printf "export PATH=$HOME/python/Python-$VERSION/bin:$PATH\n" >> ~/.bashrc
if [ ! -d ~/.local/bin ]; then mkdir -p ~/.local/bin; fi
ln -s ~/python/Python-"$VERSION"/bin/python ~/.local/bin/

source ~/.bashrc

# Install local pip
cd ..
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py -O - | python - --user
[[ ":$PATH:" != *":$HOME/.local/bin:"* ]] && printf "export PATH=$HOME/.local/bin:$PATH\n" >> ~/.bashrc

# Install modules like this:
# pip install --target="$HOME/.local/lib/python$VERSION/site-packages"

# Add those modules to PYTHONPATH
[[ ":$PYTHONPATH:" != *":$HOME/.local/lib/python$VERSION/site-packages:"* ]] && printf "export PYTHONPATH=$HOME/.local/lib/python$VERSION/site-packages:$PYTHONPATH\n" >> ~/.bashrc

source ~/.bashrc

注意:这个脚本有一些主观性,因为它会将几行代码附加到你的~/.bashrc中的路径环境变量。如果不需要,请在脚本中注释相关行。
情况:用于Avahi中Airprint服务文件的服务文件生成器不支持Python 3。为了保持系统的干净整洁,我只安装了一个本地版本的Python 2,并运行airprint-generate.py,然后删除整个安装(这样可以节省树莓派Zero W上的空间)。

引用方式不正确,但只要您的主目录路径不包含任何 shell 元字符,它就可以正常工作。正确的引用方式应该将 ~ 放在任何双引号之外,但始终在变量插值周围使用双引号。请参见 When to wrap quotes around a shell variable? - tripleee
另外,如果您不需要特定的绝对路径,\pwd`也是一个昂贵而迂回的方式来表示.`。 - tripleee
你可能想把更新.bashrcprintf语句放在一个条件语句中,以避免在之前运行过此脚本时再次添加这些行。 - tripleee
@tripleee 可能开一个聊天室来处理所有这些评论是个好主意:https://chat.stackoverflow.com/users/874188/tripleee - Jonathan Komar
抱歉,我现在不方便使用聊天工具。如果您可以等到周一,我很乐意与您讨论这些建议。 - tripleee
如果这确实是一个独立的脚本,那么最终的“source”不会有任何有用的作用。如果这是用户需要引用的,也许需要单独指出(这时候 shebang 是多余和误导的)。 - tripleee

0

我建议您不要手动从源代码构建,而是使用linuxbrew来进行构建。DigitalOcean有一个很好的tutorial,介绍如何安装linuxbrew。一旦完成安装,您只需输入brew install python,就可以拥有一个良好管理的Python安装包,包括pip。


1
请注意,链接的教程假定您拥有sudo访问权限。 - JorgeGT
Linuxbrew的自述文件(https://github.com/Linuxbrew/brew - 请注意更新后的URL)具有简短,易于理解的说明,无需root / sudo即可完成。 - Jacktose

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