加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

对相关python进口的极限答案

发布时间:2020-12-16 23:09:16 所属栏目:Python 来源:网络整理
导读:我知道 Python中有相同的导入问题有很多问题,但似乎没人设法提供正确使用的明确示例. 假设我们有一个包含两个模块foo和bar的软件包.里面的foo我们需要能够访问吧. 因为我们还在开发它,所以mypackage不在sys.path中. 我们希望能够: import mypackage.foo 运
我知道 Python中有相同的导入问题有很多问题,但似乎没人设法提供正确使用的明确示例.

假设我们有一个包含两个模块foo和bar的软件包.里面的foo我们需要能够访问吧.

因为我们还在开发它,所以mypackage不在sys.path中.

我们希望能够:

> import mypackage.foo
>运行foo.py作为脚本,并从__main__部分执行示例使用或测试.
>使用Python 2.5

为了确保在所有这些情况下都能正常工作,我们必须在foo.py中进行导入.

# mypackage/__init__.py
...

# mypackage/foo/__init__.py
...

# mypackage/bar.py  
def doBar()
    print("doBar")

# mypackage/foo/foo.py
import bar # fails with module not found
import .bar #fails due to ValueError: Attempted relative import in non-package

def doFoo():
    print(doBar())

if __name__ == '__main__':
    doFoo()

解决方法

看看 PEP 328的以下信息:

Relative imports use a module’s __name__ attribute to determine that module’s position in the package hierarchy. If the module’s name does not contain any package information (e.g. it is set to '__main__') then relative imports are resolved as if the module were a top level module,regardless of where the module is actually located on the file system.

当您将foo.py作为脚本运行时,该模块的__name__是“__main__”,因此您不能进行相对导入.即使mypackage在sys.path上也是如此.基本上,如果导入了该模块,则只能从模块进行相对导入.

以下是解决这个问题的几个选择:

1)在foo.py中,检查是否__name__ ==’__main__’,并有条件地将mypackage添加到sys.path中:

if __name__ == '__main__':
    import os,sys
    # get an absolute path to the directory that contains mypackage
    foo_dir = os.path.dirname(os.path.join(os.getcwd(),__file__))
    sys.path.append(os.path.normpath(os.path.join(foo_dir,'..','..')))
    from mypackage import bar
else:
    from .. import bar

2)始终使用mypackage导入栏导入栏,并执行foo.py,使得mypackage可以自动显示:

$cd <path containing mypackage>
$python -m mypackage.foo.foo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读