Python3:尝试在nonpackag中进行相对导入

2024-05-14 15:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

对于这个基本问题,我很抱歉,因为它与此类似: Stumped by relative imports

但我想跟着PEP328 http://www.python.org/dev/peps/pep-0328/#guido-s-decision 但这对我不起作用:(

这些是我的档案:

dev@desktop:~/Desktop/test$ ls
controller.py  __init__.py  test.py

2to3说的都是对的:

^{pr2}$

文件内容:

dev@desktop:~/Desktop/test$ cat controller.py 
class Controller:
    def __init__(self):
        pass

dev@desktop:~/Desktop/test$ cat __init__.py 
# -*- coding: utf-8 -*-

dev@desktop:~/Desktop/test$ cat test.py 
#!/usr/bin/env python
from .controller import Controller 
if __name__ == '__main__':
    print('running...')

但它的输入不起作用:

dev@desktop:~/Desktop/test$ python3 test.py 
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    from .controller import Controller 
ValueError: Attempted relative import in non-package
dev@desktop:~/Desktop/test$ 

感谢任何帮助!提前谢谢!在


Tags: infrompydevtestimportbyinit
2条回答

这并不是真正的主题,但是为了测试您的代码,我建议您看看本文Testing your code和{a2}的主题

不能在包中使用脚本;您正在运行test而不是test.test。因此,顶级脚本不能使用相对导入。在

如果希望将包作为脚本运行,则需要将test/test.py移到testpackage/__main__.py,将shell中的一个目录向上移动到~/Desktop,并告诉python使用python -m testpackage运行包。在

演示:

$ ls testpackage/
__init__.py   __main__.py   __pycache__   controller.py
$ cat testpackage/controller.py 
class Controller:
    def __init__(self):
        pass

$ cat testpackage/__init__.py 
# -*- coding: utf-8 -*-

$ cat testpackage/__main__.py 
from .controller import Controller
if __name__ == '__main__':
    print('running...')

$ python3.3 -m testpackage
running...

不能将包命名为test;Python已经为测试套件准备了这样一个包,在找到当前工作目录中的包之前就会找到它。在

另一种方法是在包的外部创建一个脚本,然后从脚本导入包。在

相关问题 更多 >

    热门问题