Python模块,如何在同一个包中引用其他模块?

3

我有一个简单的Python包,其目录结构如下:

wibble
|
|-----foo
|      |----ping.py
|
|-----bar
|      |----pong.py

简单的问题:我如何从pong.py中引用ping.py中的函数/类?查看文档,这似乎很简单,只需要在wibblefoobar的根目录中创建__init__.py文件,然后从pong.py中执行像from wibble.foo.ping import important_function这样的操作。然而,尝试这样做会导致No module named wibble.foo.ping的错误。
我确定我在文档中漏掉了某些东西,因为这一定是可以实现的。我还有点模糊关于modulenamespace之间的区别,我的背景是c#.net,所以任何类比都将非常有用。
1个回答

3

您需要将wibble添加到Python路径中(请参见官方文档),其中一种方法是

import sys
sys.path.append('/path/to/wibble')

另一种方法是使用环境变量PYTHONPATH。
export PYTHONPATH=$PYTHONPATH:/path/to/wibble

1
在Windows上,它应该是 PATH=%PATH%;c:\path\to\wibble(只是猜测,因为有C#.net参考)。 - alan
我应该说 - 这正在*nix上开发。 我对这个解决方案的担忧在于,它将软件包的绝对位置与代码库/基础设施紧密耦合。 鉴于这些文件相对容易找到,为什么“pong”不能知道它在“wibble”软件包中,然后以那种方式定位“ping”呢? - growse
你可以动态猜测pong.py文件的位置并将wibble文件夹添加到Python路径中,但这绝对是一种不好的做法。 - diegueus9
如果您对包使用类似setup.py的东西,那么代码将会运行,但问题在于:您的wibble文件夹不在Python路径中。 - diegueus9
我同意猜测是不好的实践。我将尝试在“ping”和“pong”上使用sys.path.append方法。 - growse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接