报错如下:
# pip 出现这个问题是因为:虽然已经把Python升级到了2.7版本,但是pip仍然是原来的版本,仍在原来python的site-package里面 CentOS6.8环境下,默认是python2.6.6,site-package在 # /usr/lib/python2.6/site-packages/ 很多模块都被安装在这里。直接输入pip,还是使用的原来的pip。所以我们的思路是:应该在新的Python中安装pip,这样才不会报错。 遇到此问题的人很多,网上博客都是互相抄,没有真正解决问题的。有一国外网站给出了解决方案: # wget https://pypi.python.org/packages/source/s/setuptools/setuptools-3.5.1.zip# unzip setuptools-3.5.1.zip# /usr/local/bin/pyton2.7 distribute_setup.py 使用新版本的python来运行这个脚本,这个会自动安装出来一个easy_install,然后使用这个新的easy_install来安装pip就可以了! # /usr/local/bin/easy_install pip 安装生成的所有二进制文件,都是在你的PYTHON_HOME/bin/,因为我的是安装在/usr/local/python/,所以命令都在这里,以后再调用pip要使用绝对路径,或者做链接! 2.7的模块是在以下目录 # /usr/local/lib/python2.7/site-packages 附:脚本的原文 #!python"""Bootstrap distribute installationIf you want to use setuptools in your package's setup.py, just include this
Traceback (most recent call last):File "/usr/bin/pip", line 5, in
ImportError: No module named pkg_resources
# /usr/local/bin/pip -V
pip 9.0.1 from /usr/local/lib/python2.7/site-packages/pip-9.0.1-py2.7.egg (python 2.7)
file in the same directory with it, and add this to the top of your setup.py::from distribute_setup import use_setuptoolsuse_setuptools()If you want to require a specific version of setuptools, set a download
mirror, or use an alternate download directory, you can do so by supplying
the appropriate options to ``use_setuptools()``.This file can also be run as a script to install or upgrade setuptools."""import osimport shutilimport sysimport timeimport fnmatchimport tempfileimport tarfileimport optparse
from distutils import log
try: from site import USER_SITEexcept ImportError:USER_SITE = None
try: import subprocess def _python_cmd(*args):args = (sys.executable,) + args return subprocess.call(args) == 0
except ImportError: # will be used for python 2.3def _python_cmd(*args):args = (sys.executable,) + args # quoting arguments if windowsif sys.platform == 'win32': def quote(arg): if ' ' in arg: return '"%s"' % arg return argargs = [quote(arg) for arg in args] return os.spawnl(os.P_WAIT, sys.executable, *args) == 0DEFAULT_VERSION = "0.6.49"DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"SETUPTOOLS_FAKED_VERSION = "0.6c11"SETUPTOOLS_PKG_INFO = """\
Metadata-Version: 1.0
Name: setuptools
Version: %s
Summary: xxxx
Home-page: xxx
Author: xxx
Author-email: xxx
License: xxx
Description: xxx""" % SETUPTOOLS_FAKED_VERSION
def _install(tarball, install_args=()): # extracting the tarballtmpdir = tempfile.mkdtemp()log.warn('Extracting in %s', tmpdir)old_wd = os.getcwd() try:os.chdir(tmpdir)tar = tarfile.open(tarball)_extractall(tar)tar.close() # going in the directorysubdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])os.chdir(subdir)log.warn('Now working in %s', subdir) # installinglog.warn('Installing Distribute') if not _python_cmd('setup.py', 'install', *install_args):log.warn('Something went wrong during the installation.')log.warn('See the error message above.') # exitcode will be 2return 2 finally:os.chdir(old_wd)shutil.rmtree(tmpdir)
def _build_egg(egg, tarball, to_dir): # extracting the tarballtmpdir = tempfile.mkdtemp()log.warn('Extracting in %s', tmpdir)old_wd = os.getcwd() try:os.chdir(tmpdir)tar = tarfile.open(tarball)_extractall(tar)tar.close() # going in the directorysubdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])os.chdir(subdir)log.warn('Now working in %s', subdir) # building an egglog.warn('Building a Distribute egg in %s', to_dir)_python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) finally:os.chdir(old_wd)shutil.rmtree(tmpdir) # returning the result log.warn(egg) if not os.path.exists(egg): raise IOError('Could not build the egg.')
def _do_download(version, download_base, to_dir, download_delay):egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg'% (version, sys.version_info[0], sys.version_info[1])) if not os.path.exists(egg):tarball = download_setuptools(version, download_base,to_dir, download_delay)_build_egg(egg, tarball, to_dir)sys.path.insert(0, egg) import setuptoolssetuptools.bootstrap_install_from = egg
def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,to_dir=os.curdir, download_delay=15, no_fake=True): # making sure we use the absolute pathto_dir = os.path.abspath(to_dir)was_imported = 'pkg_resources' in sys.modules or \ 'setuptools' in sys.modules try: try: import pkg_resources # Setuptools 0.7b and later is a suitable (and preferable)# substitute for any Distribute version.try:pkg_resources.require("setuptools>=0.7b") returnexcept (pkg_resources.DistributionNotFound,pkg_resources.VersionConflict): passif not hasattr(pkg_resources, '_distribute'): if not no_fake:_fake_setuptools() raise ImportError except ImportError: return _do_download(version, download_base, to_dir, download_delay) try:pkg_resources.require("distribute>=" + version) returnexcept pkg_resources.VersionConflict:e = sys.exc_info()[1] if was_imported:sys.stderr.write( "The required version of distribute (>=%s) is not available,\n""and can't be installed while this script is running. Please\n""install a more recent version first, using\n""'easy_install -U distribute'.""\n\n(Currently using %r)\n" % (version, e.args[0]))sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload okreturn _do_download(version, download_base, to_dir,download_delay) except pkg_resources.DistributionNotFound: return _do_download(version, download_base, to_dir,download_delay) finally: if not no_fake:_create_fake_setuptools_pkg_info(to_dir)
def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,to_dir=os.curdir, delay=15): """Download distribute from a specified location and return its filename`version` should be a valid distribute version number that is availableas an egg for download under the `download_base` URL (which should endwith a '/'). `to_dir` is the directory where the egg will be downloaded.`delay` is the number of seconds to pause before an actual downloadattempt. """# making sure we use the absolute pathto_dir = os.path.abspath(to_dir) try: from urllib.request import urlopen except ImportError: from urllib2 import urlopentgz_name = "distribute-%s.tar.gz" % versionurl = download_base + tgz_namesaveto = os.path.join(to_dir, tgz_name)src = dst = None if not os.path.exists(saveto): # Avoid repeated downloadstry:log.warn("Downloading %s", url)src = urlopen(url) # Read/write all in one block, so we don't create a corrupt file# if the download is interrupted.data = src.read()dst = open(saveto, "wb")dst.write(data) finally: if src:src.close() if dst:dst.close() return os.path.realpath(saveto)
def _no_sandbox(function): def __no_sandbox(*args, **kw): try: from setuptools.sandbox import DirectorySandbox if not hasattr(DirectorySandbox, '_old'): def violation(*args): passDirectorySandbox._old = DirectorySandbox._violationDirectorySandbox._violation = violationpatched = True else:patched = False except ImportError:patched = False try: return function(*args, **kw) finally: if patched:DirectorySandbox._violation = DirectorySandbox._old del DirectorySandbox._old return __no_sandboxdef _patch_file(path, content): """Will backup the file then patch it"""f = open(path)existing_content = f.read()f.close() if existing_content == content: # already patchedlog.warn('Already patched.') return Falselog.warn('Patching...')_rename_path(path)f = open(path, 'w') try:f.write(content) finally:f.close() return True_patch_file = _no_sandbox(_patch_file)
def _same_content(path, content):f = open(path)existing_content = f.read()f.close() return existing_content == content
def _rename_path(path):new_name = path + '.OLD.%s' % time.time()log.warn('Renaming %s to %s', path, new_name)os.rename(path, new_name) return new_name
def _remove_flat_installation(placeholder): if not os.path.isdir(placeholder):log.warn('Unkown installation at %s', placeholder) return Falsefound = False for file in os.listdir(placeholder): if fnmatch.fnmatch(file, 'setuptools*.egg-info'):found = True breakif not found:log.warn('Could not locate setuptools*.egg-info') returnlog.warn('Moving elements out of the way...')pkg_info = os.path.join(placeholder, file) if os.path.isdir(pkg_info):patched = _patch_egg_dir(pkg_info) else:patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) if not patched:log.warn('%s already patched.', pkg_info) return False # now let's move the files out of the wayfor element in ('setuptools', 'pkg_resources.py', 'site.py'):element = os.path.join(placeholder, element) if os.path.exists(element):_rename_path(element) else:log.warn('Could not find the %s element of the ''Setuptools distribution', element) return True_remove_flat_installation = _no_sandbox(_remove_flat_installation)
def _after_install(dist):log.warn('After install bootstrap.')placeholder = dist.get_command_obj('install').install_purelib_create_fake_setuptools_pkg_info(placeholder)
def _create_fake_setuptools_pkg_info(placeholder): if not placeholder or not os.path.exists(placeholder):log.warn('Could not find the install location') returnpyver = '%s.%s' % (sys.version_info[0], sys.version_info[1])setuptools_file = 'setuptools-%s-py%s.egg-info' % \(SETUPTOOLS_FAKED_VERSION, pyver)pkg_info = os.path.join(placeholder, setuptools_file) if os.path.exists(pkg_info):log.warn('%s already exists', pkg_info) returnlog.warn('Creating %s', pkg_info) try:f = open(pkg_info, 'w') except EnvironmentError:log.warn("Don't have permissions to write %s, skipping", pkg_info) returntry:f.write(SETUPTOOLS_PKG_INFO) finally:f.close()pth_file = os.path.join(placeholder, 'setuptools.pth')log.warn('Creating %s', pth_file)f = open(pth_file, 'w') try:f.write(os.path.join(os.curdir, setuptools_file)) finally:f.close()_create_fake_setuptools_pkg_info = _no_sandbox(_create_fake_setuptools_pkg_info
)
def _patch_egg_dir(path): # let's check if it's already patchedpkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') if os.path.exists(pkg_info): if _same_content(pkg_info, SETUPTOOLS_PKG_INFO):log.warn('%s already patched.', pkg_info) return False_rename_path(path)os.mkdir(path)os.mkdir(os.path.join(path, 'EGG-INFO'))pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')f = open(pkg_info, 'w') try:f.write(SETUPTOOLS_PKG_INFO) finally:f.close() return True_patch_egg_dir = _no_sandbox(_patch_egg_dir)
def _before_install():log.warn('Before install bootstrap.')_fake_setuptools()
def _under_prefix(location): if 'install' not in sys.argv: return Trueargs = sys.argv[sys.argv.index('install') + 1:] for index, arg in enumerate(args): for option in ('--root', '--prefix'): if arg.startswith('%s=' % option):top_dir = arg.split('root=')[-1] return location.startswith(top_dir) elif arg == option: if len(args) > index:top_dir = args[index + 1] return location.startswith(top_dir) if arg == '--user' and USER_SITE is not None: return location.startswith(USER_SITE) return True
def _fake_setuptools():log.warn('Scanning installed packages') try: import pkg_resources except ImportError: # we're coollog.warn('Setuptools or Distribute does not seem to be installed.') returnws = pkg_resources.working_set try:setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools', replacement=False)) except TypeError: # old distribute APIsetuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools')) if setuptools_dist is None:log.warn('No setuptools distribution found') return# detecting if it was already fakedsetuptools_location = setuptools_dist.locationlog.warn('Setuptools installation detected at %s', setuptools_location) # if --root or --preix was provided, and if# setuptools is not located in them, we don't patch itif not _under_prefix(setuptools_location):log.warn('Not patching, --root or --prefix is installing Distribute'' in another location') return# let's see if its an eggif not setuptools_location.endswith('.egg'):log.warn('Non-egg installation')res = _remove_flat_installation(setuptools_location) if not res: returnelse:log.warn('Egg installation')pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') if (os.path.exists(pkg_info) and_same_content(pkg_info, SETUPTOOLS_PKG_INFO)):log.warn('Already patched.') returnlog.warn('Patching...') # let's create a fake egg replacing setuptools oneres = _patch_egg_dir(setuptools_location) if not res: returnlog.warn('Patching complete.')_relaunch()
def _relaunch():log.warn('Relaunching...') # we have to relaunch the process# pip marker to avoid a relaunch bug_cmd1 = ['-c', 'install', '--single-version-externally-managed']_cmd2 = ['-c', 'install', '--record'] if sys.argv[:3] == _cmd1 or sys.argv[:3] == _cmd2:sys.argv[0] = 'setup.py'args = [sys.executable] + sys.argvsys.exit(subprocess.call(args))
def _extractall(self, path&#61;".", members&#61;None): """Extract all members from the archive to the current workingdirectory and set owner, modification time and permissions ondirectories afterwards. &#96;path&#39; specifies a different directoryto extract to. &#96;members&#39; is optional and must be a subset of thelist returned by getmembers(). """import copy import operator from tarfile import ExtractErrordirectories &#61; [] if members is None:members &#61; self for tarinfo in members: if tarinfo.isdir(): # Extract directories with a safe mode. directories.append(tarinfo)tarinfo &#61; copy.copy(tarinfo)tarinfo.mode &#61; 448 # decimal for oct 0700 self.extract(tarinfo, path) # Reverse sort directories.if sys.version_info < (2, 4): def sorter(dir1, dir2): return cmp(dir1.name, dir2.name)directories.sort(sorter)directories.reverse() else:directories.sort(key&#61;operator.attrgetter(&#39;name&#39;), reverse&#61;True) # Set correct owner, mtime and filemode on directories.for tarinfo in directories:dirpath &#61; os.path.join(path, tarinfo.name) try:self.chown(tarinfo, dirpath)self.utime(tarinfo, dirpath)self.chmod(tarinfo, dirpath) except ExtractError:e &#61; sys.exc_info()[1] if self.errorlevel > 1: raiseelse:self._dbg(1, "tarfile: %s" % e)
def _build_install_args(options): """Build the arguments to &#39;python setup.py install&#39; on the distribute package """install_args &#61; [] if options.user_install: if sys.version_info < (2, 6):log.warn("--user requires Python 2.6 or later") raise SystemExit(1)install_args.append(&#39;--user&#39;) return install_args
def _parse_args(): """Parse the command line for options """parser &#61; optparse.OptionParser()parser.add_option( &#39;--user&#39;, dest&#61;&#39;user_install&#39;, action&#61;&#39;store_true&#39;, default&#61;False,help&#61;&#39;install in user site package (requires Python 2.6 or later)&#39;)parser.add_option( &#39;--download-base&#39;, dest&#61;&#39;download_base&#39;, metavar&#61;"URL",default&#61;DEFAULT_URL,help&#61;&#39;alternative URL from where to download the distribute package&#39;)options, args &#61; parser.parse_args() # positional arguments are ignoredreturn options
def main(version&#61;DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall"""options &#61; _parse_args()tarball &#61; download_setuptools(download_base&#61;options.download_base) return _install(tarball, _build_install_args(options))
if __name__ &#61;&#61; &#39;__main__&#39;:sys.exit(main())