我是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 脚本,但是我真的需要一个吗?如何从此共享位置导入代码?
答案 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
命令时。我的导入问题只是通过为新安装的模块设置适当的权限来解决。