【问题标题】:Python not finding its PackagesPython没有找到它的包
【发布时间】:2016-09-10 01:46:25
【问题描述】:

我自己编写了一个方便的 bash 脚本,它解决了使用自己编译的 virtualenv 和 python 创建virtualenv 的任务。它旨在创建一个大部分自包含的virtualenv,如有必要,可能只在系统级别安装本机库,但在virtualenv中安装所有python包和virtualenv和pip等。

脚本可以在here找到。

我调用脚本如下:

self_contained_venv.sh \
-n udacity_model_building_and_validation \
-p https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tar.xz \
-v https://pypi.python.org/packages/c8/82/7c1eb879dea5725fae239070b48187de74a8eb06b63d9087cd0a60436353/virtualenv-15.0.1.tar.gz#md5=28d76a0d9cbd5dc42046dd14e76a6ecc \
-d pandas scikit-learn seaborn

鉴于系统上安装了编译 python 和 virtualenv 所需的包,该脚本创建了一个不错的 virtualenv。但是,当我尝试从 virtualenv 中访问任何已安装的模块/包时,python 无法找到它们。为了演示这一点,我将在此处放置一些命令和代码的输出:

首先我当然要激活 virtualenv:

. bin/activate

输出:无,没有问题。

然后我打印python知道的pythonpath:

import sys
for i in sys.path:
    print(i)

输出

/home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python34.zip
/home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python3.4
/home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python3.4/plat-linux
/home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python3.4/lib-dynload
/home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4
/home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/plat-linux
/home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python3.4/site-packages

到目前为止一切顺利。然后我尝试导入我在使用 bash 脚本期间安装的模块/包:pandas:

python

(IDLE 正在运行)

import pandas as pd

输出

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'pandas'

再试一次:

import numpy as np

输出

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'numpy'

嗯?所以没有一个包是可用的?让我们再次检查点子:

which pip

输出

alias pip='localpython/bin/pip3.4'
./localpython/bin/pip3.4

好的,所以它正在使用我的本地 pip。

检查包裹:

pip list

输出

numpy (1.11.0)
pandas (0.18.1)
pip (8.1.2)
psutil (4.1.0)
Python-contrib-nbextensions (alpha)
python-dateutil (2.5.3)
pytz (2016.4)
PyYAML (3.11)
setuptools (18.2)
six (1.10.0)
virtualenv (15.0.1)

嗯,包在那里,为什么python找不到它们?让我们看看这些包的位置,只需尝试删除一个即可:

pip uninstall pandas

输出(缩短,因为它填满了很多页面):

Uninstalling pandas-0.18.1:
 /home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/site-packages/pandas-0.18.1-py3.4.egg-info
  /home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/site-packages/pandas/__init__.py
  /home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/site-packages/pandas/__pycache__/__init__.cpython-34.pyc
  /home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/site-packages/pandas/__pycache__/_version.cpython-34.pyc
  /home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/site-packages/pandas/__pycache__/info.cpython-34.pyc

啊哈,所以包路径中。

另一个尝试找出 python 是否在正确的位置:

>>> from distutils.sysconfig import get_python_lib
>>> print(get_python_lib())
/home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python3.4/site-packages

所以如果我理解正确的话,这表明它看起来不正确。

注意

脚本做了以下事情,这可能不是很明显:

  • 编译带有前缀的python(本地python)
  • 为本地 python 编译 virtualenv
  • 它将 pip 别名为已安装 python 版本的本地 pip
  • 它将 virtualenv 别名为本地安装的虚拟环境
  • 如果指定,它会从 pypi 安装包
  • 如果有更新的版本可用,它会更新本地 pip

我还是一个初学者,还在编写 bash 脚本,所以我认为脚本的结构和逻辑相当容易理解。它还会在终端打印有关其操作成功的信息。


补充说明

  • 我没有使用susudo 运行脚本。
  • 我的操作系统是 Fedora 22,尽管我认为在这种情况下任何主要发行版都可以以相同的方式工作。
  • 最近更新了操作系统。

问题:那么为什么 Python 找不到它们/它自己的包? (我需要改变什么?)

【问题讨论】:

  • 为什么要从源代码编译python?为什么不使用 fedora 包?
  • @hd1 这应该是一个自包含的虚拟环境。我的系统上有 python 以及 anaconda 发行版,但这不是这个脚本的重点。 virtualenv 应该有自己的 python 解释器,自己的包等,不依赖于系统包。我会在问题中添加一些关于此的信息。
  • pip 卸载输出的第一行:/home/xiaolong/development/Python/udacity_model_building_and_validation/localpython/lib/python3.4/site-packages/s 不在您的 sys.path 中 - 只有您的 sys.path 中的 site-packages 目录是 /home/xiaolong/development/Python/udacity_model_building_and_validation/lib/python3.4/site-packages,它错过了 localpython 目录

标签: python bash pip virtualenv


【解决方案1】:

您能否尝试在脚本中比较路径到 pyhton 和 pip 并在系统中手动比较: which pythonwhich pip? 之后检查pip freeze | grep pandas 它应该返回你的包......如果没有,你需要将此包添加到你的 python 的 site-packages 文件夹中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2020-10-15
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多