无法在 OsX Mavericks 上创建可导入的 python 模块



我编写了一个自定义python模块。它由几个函数组成,按主题在3.py文件之间划分,这些文件都在我的主目录中名为microbiome的同一目录中。所以我的自定义模块目录的整个路径是:

/Users/drosophila/microbiome

我在小牛队工作。我想在python脚本中导入这个模块,我从不同的目录中运行该脚本。

我尝试通过编辑/etc/paths:将microbiome目录添加到路径中

sudo nano /etc/paths

然后在/etc/paths中,我写下:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/Users/drosophila/blast-2.2.22/bin
/Users/drosophila/blast-2.2.22/
/Users/drosophila/microbiome

我还尝试编辑.bash_profile如下:

export PATH="/Users/drosophila/microbiome:/Users/drosophila/anaconda/bin:$PATH"

似乎"微生物组"目录已成功添加到路径中,因为echo $PATH显示目录在其中:

/Users/drosophilq/anaconda/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usearch:/Users/drosophila/blast-2.2.22/bin:/Users/drosophila/blast-2.2.22/:/Users/drosophila/microbiome:/opt/X11/bin:/usr/texbin

然而,当我试图在python中导入微生物组模块时,它坚持认为这样的模块不存在。我有Python 3.4.1|Anaconda 2.0.1

"微生物组"目录包含一个空的__init__.py文件。

我做错了什么?

正确的方法是创建一个基于setup.py的项目,如《Python打包用户指南》中所述。

然后,您可以使用例如项目根目录中的pip3 install .来安装任何特定Python安装(或虚拟环境)的代码。这样可以确保所有内容都以正确的布局复制到一些适当的站点包目录中,在那里可以导入Python安装。

试着做标准工具自己做的事情只会让事情变得更难。


话虽如此,如果你真的,真的想,关键是你需要将你的新目录放入sys.path中,以便安装你想要的Python。修改PATH/etc/paths不会做到这一点。修改PYTHONPATH会,但它会影响每个安装。执行此操作的方法是添加.pth文件和/或sitecustomize.py文件,如site模块的文档中所述。

我不知道你的Anaconda站点包在哪里(你可以从Python中通过import sys; print(sys.path)找到),但假设它是/usr/local/anaconda/lib/python3.4/site-packages。因此,您可以在该目录中创建一个microbiome.pth文件,该文件具有指向/Users/drosophilia/microbiome目录的绝对路径。然后,每次启动Python时,该目录都将被添加到sys.path中,并且您的导入将起作用。


同样值得注意的是,如果你只想重用一个目录,就好像它是几个不同项目的一部分,而你甚至不想考虑"安装"或类似的事情,那么有更简单的方法可以做到:将目录符号链接到不同的项目中。或者,如果您使用的是版本控制,请创建一个git子模块。或各种其他类似的等价物。然后,看起来每个项目都只包含microbiome作为该项目的一部分,您不必担心路径或其他任何问题。

正如您所发现的,/etc/paths会影响$PATH。但是$PATH并不影响Python在哪里查找模块。请尝试$PYTHONPATH。详见man python

最新更新