无法从自定义包导入共享的python代码

时间:2013-11-22 19:03:07

标签: python

我是python的新手。通过tutorial阅读,我准备将一些共享代码放在一个盒子上。我视察了这条道路

>>> import sys
>>> print sys.path

在那里,我看到 /usr/lib/python2.6/site-packages 。在这个目录中找到一个目录 yum ,并在那里有一个文件 yumRepo.py 。回到翻译,我可以运行

>>> from yum import yumRepo

但是,如果我创建一个这样的自定义包/模块(注意所有其他文件都由root拥有,因此 sudo 在这里)

sudo mkdir /usr/lib/python2.6/site-packages/custom
sudo touch /usr/lib/python2.6/site-packages/custom/custom.py

并在 custom.py

def testfunc():
    print('hello from custom module!')

我无法导入它:

>>> from custom import custom
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named hnav

权限看起来与 yum 包非常相似,除了我没有 _ init _。py 脚本,但是我真的需要一个吗?如何从此共享位置导入代码?

2 个答案:

答案 0 :(得分:1)

是的,您需要在/usr/lib/python2.6/site-packages/custom中使用__init__.py文件才能使其成为Python包。这在此处记录:http://docs.python.org/2.7/tutorial/modules.html#packages

  

需要__init__.py个文件才能让Python对待   目录包含包

此外,您自己的软件包不必位于系统范围的site-packages目录中,您可以将它们放在PYTHONPATH环境变量中引用的任何目录中。

答案 1 :(得分:1)

我发现python setup.py机制并不总是将模块/包放在当前python安装稍后会找到它们的位置。例如,如果您碰巧在/usr/local/whatever上保存了模块/包源,并且/usr/local/lib/python/etc 是python sys.path的项目,{{1}无论如何,可能会将新安装的文件放在setup.py上。您可以通过指定/usr/local/lib/python/etc选项来避免这种情况,例如:

--prefix

此外,您必须检查新安装的文件和目录的权限,尤其是在使用sudo python setup.py install --prefix /usr 命令时。我的导入问题只是通过为新安装的模块设置适当的权限来解决。