101

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

例如,站点包呢? /usr/lib/python2.7/site-packages.
在 python 中复制和粘贴包是否常见?

4

6 回答 6

69

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

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

要为您的平台显示正确的目录,您可以使用python -m site --user-site


编辑:sys.path一旦你创建它就会出现:

mkdir -p "`python -m site --user-site`"
于 2013-04-24T15:44:21.087 回答
29

因此,如果您像我这样的新手并且您的目录组织得不是很好,您可能想尝试这种方法。

打开你的 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"

现在你应该可以导入你的模块了。

于 2015-06-29T06:21:53.930 回答
8

这对我有用(我必须经常创建上传到私有 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 包,您可以使用。

我发现这种方法对我很有用。如果您不需要打包模块以供其他系统使用而不仅仅是您的本地系统,则此方法可能是一种矫枉过正

快乐的黑客。

于 2015-06-29T06:39:45.557 回答
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 正在寻找的路径的符号链接。

符号链接创建命令将是:

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 默认值。

于 2016-10-26T14:30:37.183 回答
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,我知道将模块放在哪里。

希望能帮助到你。

于 2016-06-28T14:48:10.013 回答
-2

如果你正在开发一个模块,我建议你遵循这个。

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

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

于 2020-07-01T10:45:18.827 回答