我应该在哪里放置自己的python模块,以便可以将其导入


86

我在python中有自己的软件包,并且经常使用。我应该在哪里放置软件包,以便在不使用PYTHONPATH或sys.path的情况下将其导入,这是什么最优雅或传统的目录?

例如,网站包呢? /usr/lib/python2.7/site-packages
在python中复制并粘贴软件包是否很常见?


1
创建一个setup.py来告诉依赖项和不依赖项,并使用它是一种更好的做法,并且更易于移植……但是,是的,通常复制/粘贴可以正常工作……尽管我通常会创建一个名为“ user / lib / ”或其他内容,然后将其全部放到我的PYTHONPATH上
Joran Beasley

1
真正的答案:对于个人简单脚本/非分布式软件包,我不喜欢其他答案,例如@JoranBeasley:创建一些文件夹以保存脚本(或链接到它们),然后从bash中将该文件夹添加到PYTHONPATH中Runcom树(例如,将脚本/链接放入中~/foo/bar/,添加export PYTHONPATH=~/foo/bar # fields separated by ":"到您的~/.bashrc文件中)。请参阅man python,此手动路径位于默认的python搜索路径之前。注意名称冲突。

Answers:


60

我通常将要准备导入的内容放在用户站点目录中:

~/.local/lib/pythonX.X/site-packages

要显示适合您平台的目录,可以使用 python -m site --user-site


编辑:sys.path创建后将显示在其中:

mkdir -p "`python -m site --user-site`"

当我从终端打开python时,这就是sys.path给出的。注意没有本地['','/usr/lib64/python27.zip','/usr/lib64/python2.7','/usr/lib64/python2.7/plat-linux2','/ usr / lib64 / python2.7 / lib-tk','/ usr / lib64 / python2.7 / lib-old','/ usr / lib64 / python2.7 / lib-dynload','/ usr / lib64 / python2.7 /site-packages”、“/usr/lib64/python2.7/site-packages/PIL”、“/usr/lib64/python2.7/site-packages/gst-0.10”、“/usr/lib64/python2”。 7 / site-packages / gtk-2.0','/ usr / lib / python2.7 / site-packages','/ usr / lib / python2.7 / site-packages / setuptools-0.6c11-py2.7.egg -info']
Cobry

执行脚本时,这就是它所提供的内容['/ home / username / Desktop / mypackage / Examples','/usr/lib64/python27.zip','/usr/lib64/python2.7','/ usr / lib64 /python2.7/plat-linux2'、'/usr/lib64/python2.7/lib-tk'、'/usr/lib64/python2.7/lib-old'、'/usr/lib64/python2.7/ lib-dynload','/ usr / lib64 / python2.7 / site-packages','/ usr / lib64 / python2.7 / site-packages / PIL','/ usr / lib64 / python2.7 / site-packages /gst-0.10'、'/usr/lib64/python2.7/site-packages/gtk-2.0'、'/usr/lib/python2.7/site-packages'、'/usr/lib/python2.7/ site-packages / setuptools-0.6c11-py2.7.egg-info']
Cobry 2013年

python -m site --user-site /home/username/.local/lib/python2.7/site-packages,但这不在sys.path中!
Cobry 2013年

@Cobrypython -m site --user-site会告诉您应该创建哪个目录。sys.modules除非您真正创建它,否则它不会出现在其中。
2013年

@mata你或许应该改变mkdir,以mkdir -p创建中间目录。我什至没有~/.local。;-)
Aya

27

因此,如果像我这样的新手和您的目录都没有很好的组织,则可以尝试使用此方法。

打开您的python终端。在我的情况下,导入一个您知道可以工作的模块,例如numpy,然后执行以下操作。 Import numpy

numpy.__file__

导致

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

结果numpy.__file__是您应该将python文件与模块一起放置的位置(不包括numpy/__init__.py),因此对我来说

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

为此,只需转到您的终端并输入

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

现在,您应该能够导入模块了。


为什么在我的Python中,“ ._ file_”不起作用?>>> import re >>> re._file_回溯(最近一次调用):文件“ <pyshell#10>”,<module>中的第1行,re._file_ AttributeError:模块're'没有属性' file '
Urso

3
@Urso您确定要使用两个下划线吗?该命令re.__file__对我有用。
arie64

非常感谢@ arie64提供这种干净的解决方案。对我也很好!
Bms bharadwaj

谢谢这也为我工作。但是很奇怪,我无法在文件资源管理器中找到将模块发送到的目录/文件夹。似乎该文件夹不存在。知道为什么文件夹没有显示在应该显示的位置吗?(我启用了“显示隐藏的项目”,所以这不只是...)
安德烈

7

这对我有用(我必须经常创建上传到私有pip存储库的python包)。详细阐述@joran对这个问题的评论。

  1. 创建一个“构建目录”,该目录用作创建软件包的工作空间。您选择的任何目录都可以
  2. 复制您的python软件包目录,然后创建一个setup.py文件。这个应该有助于正确创建setup.py。
  3. 创建一个virtualenv为您正在处理的项目。virtualenvs还有很多其他好处,我在这里不做详细介绍。
  4. 创建一个本地dist包python setup.py sdist --format=tar。理想情况下,创建的包应位于dist文件夹中。
  5. 将软件包安装在您的virtualenv上(激活后)。 pip install <yourpackage>.tar

你可以使用pip install --force-reinstall,如果你需要玩的库越来越重新创建DIST包。

我发现这种方法非常适合我。如果您不需要打包模块以供其他系统使用,而不仅仅是本地系统,则此方法可能会过大

骇客入侵。


1

在Mac上,我做了一个sudo find / -name "site-packages"。这给了我喜欢的几个路径/Library/Python/2.6/site-packages/Library/Python/2.7/site-packages/opt/X11/lib/python2.6/site-packages

因此,如果我使用的是v2.7或v2.6,我知道将模块放置在哪里。

希望能帮助到你。


1

可以通过添加以下源代码来提取导入文件夹:

import sys
print sys.path

自动生成符号链接的示例为:

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

而不是“ em”,您可以使用“刚安装但python看不到”的其他软件包

下面,我将在评论中详细说明。

假设您已使用以下命令安装了python模块em或pyserial(示例适用于ubuntu):

sudo pip install pyserial

输出是这样的:

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

问题将随之而来-python无法看到pyserial模块,为什么?因为安装模块的位置不是您的特定用户帐户所用的python。

解决方案-我们必须从pyserial到达的路径到您的python正在寻找的路径创建符号链接。

symlink创建命令为:

ln -s <what_to_link> <where_to_link>

而不是输入确切的位置,我们要求pip通过执行命令告诉我们模块在哪里存储:

pip show pyserial | grep "Location"| cut -d " " -f2

而不是输入确切的位置,我们要求python通过执行命令告诉我们它在哪里寻找正在安装的模块:

python -m site --user-site

必须使用“`”字符转义这两个命令(通常在美国键盘的1按钮的左侧)

结果将为ln提供以下命令,并创建丢失的符号链接:

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

或类似的东西,取决于您的发行版和python / pip默认值。


看起来像是强大的一线工具...您能为我们讲解一下Linux新手吗?人们可能会警惕使用他们不理解的东西:-)
钢琴詹姆斯(James)

-1

如果您正在开发模块,建议您遵循此步骤。

import sys
sys.path.append("/home/mylinux/python-packages")

现在,您保留的任何模块都可以python-packages通过导入Python-interpreter

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.