在Ubuntu中编译Python 2.6.6并需要外部软件包wxPython,setuptools等

发布于 2021-01-29 15:00:42

我使用google-perf工具(tcmalloc)库编译了Python
2.6.6,以消除默认2.6.5下的内存问题。在获得2.6.6后,它似乎无法正常工作,因为我认为在Ubuntu中安装默认的2.6.5存在问题。从软件渠道安装的二进制文件(如wxPython和setuptools)在2.6.6下不能正常工作。这些是否需要重新编译?还有其他建议可以使其顺利运行。是否可以在不更改路径的情况下将2.6.5设置为默认值?该路径首先在usr
/ local / bin中查找。

关注者
0
被浏览
96
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    一个好的一般经验法则是, 切勿 将默认系统安装的Python用于除杂项系统管理脚本之外的任何软件开发。这适用于所有UNIX,包括Linux和OS /
    X。

    相反,请使用所需的库(Python和C)构建一个由您控制的优秀Python发行版,并将此tarball安装在非系统目录中,例如/ opt / devpy或/
    data / package / python或/ home /蟒蛇。当2.7.2可用时,为什么会搞乱2.6?

    并且在构建它时,请确保其所有依赖项都在其自己的目录树(RPATH)中,并且将所有系统依赖项(.so文件)复制到其目录树中。这是我的版本。如果仅运行整个Shell脚本,则可能无法正常工作。我总是将其部分复制并粘贴到终端窗口中,并确认每个步骤都正常。确保将终端属性设置为允许多行回滚,或者一次仅粘贴几行。

    (实际上,在进行了一些调整之后,我认为这可以作为脚本运行,但是我建议./pybuild.sh >pylog 2>&1您使用类似的方法,以便您可以梳理输出并验证一切正常。

    这是基于Ubuntu 64位构建的

    #!/bin/bash
    
    shopt -s compat40
    
    export WGET=echo
    #uncomment the following if you are running for the first time
    export WGET=wget
    
    sudo apt-get -y install build-essential
    sudo apt-get -y install zlib1g-dev libxml2-dev libxslt1-dev libssl-dev libncurses5-dev 
    sudo apt-get -y install libreadline6-dev autotools-dev autoconf automake libtool
    sudo apt-get -y install libsvn-dev mercurial subversion git-core
    sudo apt-get -y install libbz2-dev libgdbm-dev sqlite3 libsqlite3-dev
    sudo apt-get -y install curl libcurl4-gnutls-dev
    sudo apt-get -y install libevent-dev libev-dev librrd4 rrdtool
    sudo apt-get -y install uuid-dev libdb4.8-dev memcached libmemcached-dev 
    sudo apt-get -y install libmysqlclient-dev libexpat1-dev
    
    cd ~
    $WGET 'http://code.google.com/p/google-perftools/downloads/detail?name=google-perftools-1.7.tar.gz'
    $WGET http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
    tar zxvf Python-2.7.2.tgz
    cd Python-2.7.2
    
    #following is needed if you have an old version of Mercurial installed
    #export HAS_HG=not-found
    
    # To provide a uniform build environment
    unset PYTHONPATH PYTHONSTARTUP PYTHONHOME PYTHONCASEOK PYTHONIOENCODING
    unset LD_RUN_PATH LD_LIBRARY_PATH LD_DEBUG LD_TRACE_LOADED_OBJECTS 
    unset LD_PRELOAD SHLIB_PATH LD_BIND_NOW LD_VERBOSE
    
    ## figure out whether this is a 32 bit or 64 bit system
    m=`uname -m`
    if [[ $m =~ .*64 ]]; then
       export CC="gcc -m64" 
       NBITS=64
    elif [[ $m =~ .*86 ]]; then
       export CC="gcc -m32"
       NBITS=32
    else # we are confused so bail out
       echo $m
       exit 1
    fi
    
    # some stuff related to distro independent build
    # extra_link_args = ['-Wl,-R/data1/python27/lib']
    #--enable-shared and a relative 
    # RPATH[0] (eg LD_RUN_PATH='${ORIGIN}/../lib')
    
    export TARG=/data1/packages/python272
    export TCMALLOC_SKIP_SBRK=true
    #export CFLAGS='-ltcmalloc' # Google's fast malloc
    export COMMONLDFLAGS='-Wl,-rpath,\$$ORIGIN/../lib -Wl,-rpath-link,\$$ORIGIN:\$$ORIGIN/../lib:\$$ORIGIN/../../lib -Wl,-z,origin -Wl,--enable-new-dtags'
    # -Wl,-dynamic-linker,$TARG/lib/ld-linux-x86-64.so.2
    export LDFLAGS=$COMMONLDFLAGS
    ./configure --prefix=$TARG --with-dbmliborder=bdb:gdbm --enable-shared --enable-ipv6
    
    # if you have ia32-libs installed on a 64-bit system
    #export COMMONLDFLAGS="-L/lib32 -L/usr/lib32 -L`pwd`/lib32 -Wl,-rpath,$TARG/lib32 -Wl,-rpath,$TARG/usr/lib32"
    
    make
    # ignore failure to build the following since they are obsolete or deprecated
    # _tkinter bsddb185 dl imageop sunaudiodev
    
    #install it and collect any dependency libraries - not needed with RPATH
    sudo mkdir -p $TARG
    sudo chown `whoami`.users $TARG
    make install
    
    # collect binary libraries ##REDO THIS IF YOU ADD ANY ADDITIONAL MODULES##
    function collect_binary_libs {
    cd $TARG
    find . -name '*.so' | sed 's/^/ldd -v /' >elffiles
    echo "ldd -v bin/python" >>elffiles
    chmod +x elffiles
    ./elffiles | sed 's/.*=> //;s/ .*//;/:$/d;s/^              *//' | sort -u | sed 's/.*/cp -L & lib/' >lddinfo
    # mkdir lib
    chmod +x lddinfo
    ./lddinfo
    cd ~
    }
    collect_binary_libs
    
    #set the path
    cd ~
    export PATH=$TARG/bin:$PATH
    
    #installed setuptools
    $WGET http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
    chmod +x setuptools-0.6c11-py2.7.egg
    ./setuptools-0.6c11-py2.7.egg
    
    #installed virtualenv
    tar zxvf virtualenv-1.6.1.tar.gz
    cd virtualenv-1.6.1
    python setup.py install
    cd ~
    
    # created a base virtualenv that should work for almost all projects
    # we make it relocatable in case its location in the filesystem changes.
    cd ~
    python virtualenv-1.6.1/virtualenv.py /data1/py27base # first make it
    python virtualenv-1.6.1/virtualenv.py --relocatable  /data1/py27base #then relocatabilize
    
    # check it out
    source ~/junk/bin/activate
    python --version
    
    # fill the virtualenv with useful modules
    # watch out for binary builds that may have dependency problems
    
    export LD_RUN_PATH='\$$ORIGIN:\$$ORIGIN/../lib:\$$ORIGIN/../../lib'
    easy_install pip
    pip install cython
    pip install lxml
    pip install httplib2
    pip install python-memcached
    pip install amqplib
    pip install kombu
    pip install carrot
    pip install py_eventsocket
    pip install haigha
    
    # extra escaping of $ signs
    export LDFLAGS='-Wl,-rpath,\$\$$ORIGIN/../lib:\$\$$ORIGIN/../../lib -Wl,-rpath-link,\$\$$ORIGIN/../lib -Wl,-z,origin -Wl,--enable-new-dtags'
    # even more complex to build this one since we need some autotools and
    # have to pull source from a repository
    mkdir rabbitc
    cd rabbitc
    hg clone http://hg.rabbitmq.com/rabbitmq-codegen/
    hg clone http://hg.rabbitmq.com/rabbitmq-c/
    cd rabbitmq-c
    autoreconf -i
    make clean
    ./configure --prefix=/usr
    make
    sudo make install
    cd ~
    
    # for zeromq we get the latest source of the library
    $WGET http://download.zeromq.org/zeromq-2.1.7.tar.gz
    tar zxvf zeromq-2.1.7.tar.gz
    cd zeromq-2.1.7
    make clean
    ./configure --prefix=/usr
    make
    sudo make install
    cd ~
    # need less escaping of $ signs
    export LDFLAGS='-Wl,-rpath,\$ORIGIN/../lib:\$ORIGIN/../../lib -Wl,-rpath-link,\$ORIGIN/../lib -Wl,-z,origin -Wl,--enable-new-dtags'
    pip install pyzmq
    pip install pylibrabbitmq # need to build C library and install first
    pip install pylibmc
    pip install pycurl
    export LDFLAGS=$COMMONLDFLAGS
    
    
    pip install cherrypy
    pip install pyopenssl # might need some ldflags on this one?
    pip install diesel
    pip install eventlet
    pip install fapws3
    pip install gevent
    pip install boto
    pip install jinja2
    pip install mako
    pip install paste
    pip install twisted
    pip install flup
    pip install pika
    pip install pymysql
    # pip install py-rrdtool # not on 64 bit???
    pip install PyRRD
    pip install tornado
    pip install redis
    
    # for tokyocabinet we need the latest source of the library
    $WGET http://fallabs.com/tokyocabinet/tokyocabinet-1.4.47.tar.gz
    tar zxvf tokyocabinet-1.4.47.tar.gz
    cd tokyocabinet-1.4.47
    make clean
    ./configure --prefix=/usr --enable-devel
    make
    sudo make install
    cd ..
    $WGET http://fallabs.com/tokyotyrant/tokyotyrant-1.1.41.tar.gz
    tar zxvf tokyotyrant-1.1.41.tar.gz
    cd tokyotyrant-1.1.41
    make clean
    ./configure --prefix=/usr --enable-devel
    make
    sudo make install
    cd ..
    pip install tokyo-python
    pip install solrpy
    pip install pysolr
    pip install sunburnt
    pip install txamqp
    pip install littlechef
    pip install PyChef
    pip install pyvb
    pip install bottle
    pip install werkzeug
    pip install BeautifulSoup
    pip install XSLTools
    pip install numpy
    pip install coverage
    pip install pylint
    # pip install PyChecker  ???
    pip install pycallgraph
    pip install mkcode
    pip install pydot
    pip install sqlalchemy
    pip install buzhug
    pip install flask
    pip install restez
    pip install pytz
    pip install mcdict
    # need less escaping of $ signs
    
    pip install py-interface
    # pip install paramiko # pulled in by another module
    pip install pexpect
    
    # SVN interface
    $WGET http://pysvn.barrys-emacs.org/source_kits/pysvn-1.7.5.tar.gz
    tar zxvf pysvn-1.7.5.tar.gz
    cd pysvn-1.7.5/Source
    python setup.py backport
    python setup.py configure
    make
    cd ../Tests
    make
    cd ../Sources
    mkdir -p $TARG/lib/python2.7/site-packages/pysvn
    cp pysvn/__init__.py $TARG/lib/python2.7/site-packages/pysvn
    cp pysvn/_pysvn_2_7.so $TARG/lib/python2.7/site-packages/pysvn
    cd ~
    
    # pip install protobuf #we have to do this the hard way
    $WGET http://protobuf.googlecode.com/files/protobuf-2.4.1.zip
    unzip protobuf-2.4.1.zip
    cd protobuf-2.4.1
    make clean
    ./configure --prefix=/usr
    make
    sudo make install
    cd python
    python setup.py install
    cd ~
    
    pip install riak
    pip install ptrace
    pip install html5lib
    pip install metrics
    
    #redo the "install binary libraries" step
    collect_binary_libs
    
    # link binaries in the lib directory to avoid search path errors and also
    # to reduce the number of false starts to find the library
    for i in `ls $TARG/lib/python2.7/lib-dynload/*.so`
    do
    ln -f $i $TARG/lib/`basename $i`
    done
    # for the same reason link the whole lib directory to some other places in the tree
    ln -s ../.. $TARG/lib/python2.7/site-packages/lib
    
    # bundle it up and save it for packaging
    cd /
    tar cvf - .$TARG |gzip >~/py272-$NBITS.tar.gz
    cd ~
    
    # after untarring on another machine, we have a program call imports.py which imports 
    # every library as a quick check that it works. For a more positive check, run it like this
    # strace -e trace=stat,fstat,open python imports.py >strace.txt 2>&1 
    # grep -v ' = -1' strace.txt |grep 'open(' >opens.txt
    # sed <opens.txt 's/^open("//;s/".*//' |sort -u |grep -v 'dynload' |grep '\.so' >straced.txt
    # ls -1d /data1/packages/python272/lib/* |sort -u >lib.txt
    # then examine the strace output to see how many places it searches before finding it.
    # a successful library load will be a call to open that doesn't end with ' = -1'
    # If it takes too many tries to find a particular library, then another symbolic link may 
    # be a good idea
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看