Python中的__name__,Pydev

时间:2017-04-10 22:54:38

标签: python python-3.x package pydev

我正在使用PyDev在python3中创建一个包。我的一个.py文件有一个简单的相对导入from . import filename。当我使用包外的另一个文件从包中导入并测试该文件时,它工作正常,但直接在PyDev中运行该文件失败,出现此错误:

ImportError: attempted relative import with no known parent package

经过大量搜索后,我发现一些代码在我进行任何导入之前添加时都有效:

__path__ = [""] # indicates local directory
__package__ = ["package_name"]

然后一切都运行良好。但是,只是一个测试,在该文件中我放了这一行:print(__name__)

输出为两个字符串!

package_name
__main__

我怀疑这只是因为它在一个软件包中直接运行,但是我该如何处理if __name__ == "__main__":之类的内容?

当我使用__name__ var more:

时,这里有更多输出
print(repr(__name__))
# output
'package_name'
'__main__'

print(__name__.endswith("__main__"))
# output
False
True

print(type(__name__))
# output
<class 'str'>
<class 'str'>

我甚至不理解变量如何分配两个单独的字符串。发生了什么事?

1 个答案:

答案 0 :(得分:0)

这是一个已知的Python问题...以__main__运行的文件不能在其中包含相对导入,除非它们使用-m标志运行(使用给定的名称导入模块然后更改其__name__以将其作为__main__运行。

默认情况下,PyDev会定期运行该文件,但您也可以要求它按计算模块名称运行该文件(参见preferences > PyDev > Run > Launch modules with "python -m mod.name")。

就个人而言,我建议你不要在你的__main__模块中放置相对导入(因为那时用户也不能将你的模块作为python filename.py运行,并且还必须运行-m标志),但如果你没问题,可以在PyDev中启用该选项。