我正在使用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'>
我甚至不理解变量如何分配两个单独的字符串。发生了什么事?
答案 0 :(得分:0)
这是一个已知的Python问题...以__main__
运行的文件不能在其中包含相对导入,除非它们使用-m
标志运行(使用给定的名称导入模块然后更改其__name__
以将其作为__main__
运行。
默认情况下,PyDev会定期运行该文件,但您也可以要求它按计算模块名称运行该文件(参见preferences > PyDev > Run > Launch modules with "python -m mod.name"
)。
就个人而言,我建议你不要在你的__main__
模块中放置相对导入(因为那时用户也不能将你的模块作为python filename.py
运行,并且还必须运行-m
标志),但如果你没问题,可以在PyDev中启用该选项。