如何在Python中预先添加sys.path的路径?

max*_*max 23 python ubuntu pip easy-install pythonpath

问题描述:

使用pip,我升级到了最新版本的请求(版本2.7.0,pip show requests给出了位置/usr/local/lib/python2.7/dist-packages).但是当我在交互式命令行中import requests打印requests.__version__时,我看到的是版本2.2.1.事实证明,Python正在使用预先安装的Ubuntu版本的请求(requests.__file__/usr/lib/python2.7/dist-packages/requests/__init__.pyc- 不是/user/local/lib/...).

从我的调查来看,这个事实是由于Ubuntu对Python搜索路径的改变(我运行Ubuntu 14.04)引起了Ubuntu Python包的路径(对于我的机器,这种情况发生在usr/local/lib/python2.7/dist-packages/easy-install.pth).在我的情况下,这会导致使用apt-get预先与Ubuntu打包的请求版本,而不是我想要使用的pip版本.

我在找什么:

我希望sys.path在到Ubuntu的Python安装目录的路径之前,全局地将pip的安装目录路径预先添加到Python的搜索路径().由于在我的许多Python脚本中使用了请求(以及许多其他包),我不想手动更改计算机上每个文件的搜索路径.

令人不满意的解决方案1:使用virtualenv

使用virtualenv会对我的机器造成不必要的更改,因为我必须重新安装全局存在的每个包.我只想从Ubuntu的软件包升级到pip的软件包.

不满意的解决方案2:更改easy-install.pth

由于easy-install.pth每次easy-install使用都会被覆盖,easy-install.pth因此如果安装了新软件包,我的更改将被删除.此问题使我很难在我的机器上维护包.

不满意(但我到目前为止最好)解决方案3:添加一个单独的.pth文件

在与easy-install.pth相同的目录中,我添加了一个zzz.pth内容:

import sys; sys.__plen = len(sys.path)
/usr/lib/python2.7/dist-packages/test_dir
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Run Code Online (Sandbox Code Playgroud)

site.pyPython启动时会读取此文件.由于它的文件名easy-install.pth是以字母数字形式出现的,因此它会在site.py之后被消耗掉.总之,文件的第一行和最后一行预先添加路径sys.path(这些行取自easy-install.pth).

我不喜欢这个解决方案如何依赖于文件名的字母数字排序来正确放置新路径.

PYTHONPATHs来自Ubuntu的路径

Stack Overflow的另一个答案对我不起作用.我的PYTHONPATH路径来自路径easy-install.pth,它使用我在"不满意的解决方案3"中提到的相同代码来预先添加其路径.

先感谢您!

Sof*_*nic 10

这不推荐*,但是你可以从你的python脚本中做到

>>> import sys
>>> sys.path.insert(0,'/home/anand/')
>>> print(sys.path)
['/home/anand/', '', '/usr/local/lib/python2.7/dist-packages/_pdbpp_path_hack', '/usr/local/lib/python2.7/dist-packages/goose-0.0.1-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/jieba-0.33-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/cssselect-0.9.1-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/nanoservice-0.1.5-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/nanomsg-1.0a2-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/msgpack_python-0.4.2-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/DecisionTree-2.2.5-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/nudepy-0.2-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/wsgilog-0.3-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/distribute-0.7.3-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/PIL-1.1.7-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/MySQL_python-1.2.5-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/munkres-1.0.7-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/parsedatetime-1.4-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/argparse-1.3.0-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/tusker-0.1-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/SQLAlchemy-1.0.3-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/numpy-1.9.2-py2.7-linux-x86_64.egg', '/usr/local/lib/python2.7/dist-packages/turkic-0.2.5-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/scikits.bootstrap-0.3.2-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/pyvision-0.1-py2.7-linux-x86_64.egg', '/home/anand/playspace/languages/python_pkgs/ets', '/usr/local/lib/python2.7/dist-packages/Scrapy-1.1.0dev1-py2.7.egg', '/usr/lib/python2.7/dist-packages', '/home/anand/playspace', '/home/anand/workspace/pyvision/src', '/home/anand/playspace/yapf', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/Orange/orng', '/usr/local/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']
>>>
Run Code Online (Sandbox Code Playgroud)

在此之后,您的导入将在查找其他任何位置之前查看前置路径.

  • - 对于路径的硬编码和脚本无法在其他任何地方运行.

  • 示例用例:我从 GitHub 克隆了我想要探索的 Python 包的源代码(例如插入断点、打印语句、测试修改)。我已经安装了这个包,并且我不想卸载它、安装我的测试等。我可以在测试脚本中使用此技术来专门更改包副本,而不会影响其他任何内容。它在这里很有用,但绝对不是作为运行代码的通用方法。 (3认同)

fiv*_*lor 7

你不应该乱用pip的路径,python实际上在我的经验中自动处理它的路径.看来你安装了两个蟒蛇.如果输入:

which pip
which python
Run Code Online (Sandbox Code Playgroud)

你看到了什么路径?如果它们不在同一个/ bin文件夹中,那那就是你的问题.我猜你正在运行的python(可能是最初的系统),没有安装它自己的pip.您可能只需要确保要运行的python的路径应该位于.bashrc或.zshrc中的/ usr/bin之前

如果这是正确的,那么你应该看到:

which easy_install
Run Code Online (Sandbox Code Playgroud)

与你正在使用的python安装共享相同的路径,可能在/ usr/local/bin下.然后运行:

easy_install pip
Run Code Online (Sandbox Code Playgroud)

并开始为您正在使用的python安装正确的软件包.


J R*_*ape 5

回答直接问题

您可以创建一个名为sitecustomizein yoursite-packages目录的目录。我们将把它变成一个sitecustomize模块,如此处所述Python 2 )。具体来说:

尝试导入名为 sitecustomize 的模块,该模块可以执行任意特定于站点的自定义。它通常由系统管理员在您的 site-packages 目录中创建。

sitecustomize目录中创建一个名为 的文件__init__.py,并在其中添加您想要执行的操作。一个非常简单的例子是:

import sys
sys.path = ['/your/path/to/pip/install'] + sys.path
Run Code Online (Sandbox Code Playgroud)

就你而言,我认为your/path.../usr/local/lib/python2.7/dist-packages。您可能想做一些更复杂的事情,但这sys.path会粗略地前置并在 python 启动时运行(例如在命令行中启动解释器,或从文件运行 python 脚本)。

警告

我并不大力提倡这样做——这是一种做你想做的事情的有点直率的方式。但您明确表示,使用 avirtualenv对您来说是不可取的,并且您希望“全局”进行更改,我认为这将达到您想要的效果。

对根本问题的思考

我认为@ Fivetentaylor 的答案在这里是正确的 - 看来您正在使用pip一个安装中的python可执行文件作为另一个安装。通过弄乱路径来掩盖这一点可能很快就会变得非常混乱。我绝对会确保您pip每次安装都有一个单独的python并且您使用它。这应该使单独安装的目录结构保持独立。否则,您将强制一个安装使用另一安装目录中的软件包。技术上没有问题,但逻辑上令人困惑。


buf*_*ufh 3

\n

使用 virtualenv 会对我的机器造成不必要的更改,因为我必须重新安装全局存在的每个包。我只想从 Ubuntu 的软件包升级到 pip 的软件包。

\n
\n\n

不,你可以使用--system-site-packages.

\n\n

编辑

\n\n
# make your new virtualenv\nuser@darkstar:~$ mkvirtualenv --system-site-packages max\n(max)user@darkstar:~$ python\n>>> pprint(sys.path)\n[\'\',\n \'/home/user/.virtualenvs/max/lib64/python27.zip\',\n \'/home/user/.virtualenvs/max/lib64/python2.7\',\n \'/home/user/.virtualenvs/max/lib64/python2.7/plat-linux2\',\n \'/home/user/.virtualenvs/max/lib64/python2.7/lib-tk\',\n \'/home/user/.virtualenvs/max/lib64/python2.7/lib-old\',\n \'/home/user/.virtualenvs/max/lib64/python2.7/lib-dynload\',\n \'/usr/lib64/python2.7\',\n \'/usr/lib/python2.7\',\n \'/usr/lib64/python2.7/lib-tk\',\n \'/home/user/.virtualenvs/max/lib/python2.7/site-packages\',\n \'/usr/lib64/python2.7/site-packages/google_api_python_client-1.2-py2.7.egg\',\n \'/usr/lib64/python2.7/site-packages\',\n \'/usr/lib64/python2.7/site-packages/PIL\',\n \'/usr/lib64/python2.7/site-packages/gtk-2.0\',\n \'/usr/lib64/python2.7/site-packages/IPython/extensions\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,此 virtualenv 的路径包括系统路径。\n为了检查它是否正常工作,我在系统范围内安装了一个软件包在创建 virtualenv

\n\n
root@darkstar:~: pip install igraph\nCollecting igraph\n  Downloading igraph-0.1.8-py2.py3-none-any.whl (119kB)\n    100% |\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 122kB 1.7MB/s\nCollecting ipython (from igraph)\n  Downloading ipython-3.2.1-py2-none-any.whl (3.4MB)\n    100% |\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 3.4MB 203kB/s \nInstalling collected packages: ipython, igraph\nSuccessfully installed igraph-0.1.8 ipython-3.2.1\nroot@darkstar:~: python -c \'print __import__("igraph")\'\n<module \'igraph\' from \'/usr/lib64/python2.7/site-packages/igraph/__init__.pyc\'>\n\n(max)user@darkstar:max$ python -c \'print __import__("igraph")\'\n<module \'igraph\' from \'/usr/lib64/python2.7/site-packages/igraph/__init__.pyc\'>\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然,virtualenv 中安装的内容优先于系统范围的库。

\n\n

我相信这能满足您的需求。

\n