【问题标题】:Python modules, referencing other modules within the same package?Python模块,引用同一包中的其他模块?
【发布时间】:2012-05-05 12:11:43
【问题描述】:

我有一个简单的 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,所以这里的任何类比都会有用。

【问题讨论】:

    标签: python module package


    【解决方案1】:

    你需要添加wibble到python路径(见the official documentation),一种方法是

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

    另一种方法是使用环境变量 PYTHONPATH

    export PYTHONPATH=$PYTHONPATH:/path/to/wibble
    

    【讨论】:

    • 在 Windows 上,应该是 PATH=%PATH%;c:\path\to\wibble (只是猜测,因为 c#.net 参考。)
    • 我应该说 - 这是在 *nix 上开发的。我对这个解决方案的担忧是它将包的绝对位置与代码库/基础设施紧密联系在一起。鉴于这些文件彼此之间很容易定位,为什么pong 不能知道它在wibble 包中,然后以这种方式定位ping
    • 您可以直接猜测 pong.py 文件的位置并将 wibble 文件夹添加到 python 路径,但这绝对是一个不好的做法
    • 如果你对你的包使用 setup.py 之类的东西,代码就可以了,但这里的问题是:你的文件夹 wibble 不在 python 路径中。
    • 我同意猜测是不好的做法。我将在pingpong 上尝试sys.path.append 方法。
    猜你喜欢
    • 2015-10-06
    • 2017-10-05
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2021-11-09
    • 2015-09-08
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多