2017-04-10 52 views
2

我正在使用PyDev在python3中创建一个包。我的一个.py文件有一个简单的相对导入,from . import filename。当我使用另一个文件包外,从包中导入并测试了该文件,它工作正常,但在运行该文件直接PyDev的失败,此错误:Python中的__name__,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更多:

print(repr(__name__)) 
# output 
'package_name' 
'__main__' 

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

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

我甚至不明白一个变量如何能够分配给它的两个独立的字符串。到底是怎么回事?

+0

这听起来像这个文件实际上运行两次。有几种方法可能会让进口系统混淆足以发生这种情况。 – user2357112

+0

到目前为止,最简单的解决方案就是不尝试直接运行软件包内容,但不尝试将同一文件制作为可导入的模块和脚本。 – user2357112

+0

@ user2357112它运行两次很有意义,关于如何发生的任何想法?为了回应您的其他评论,我认为这就是我现在要做的。这个文件并不是真的需要成为一个可运行的脚本,我只是感兴趣的是它不会在运行时产生错误。谢谢您的帮助! – Cole128

回答

0

这是一个已知的Python问题......文件运行为__main__不能对他们有相对的进口,除非他们与-m标志(其中进口模块与给定的名称来运行,然后改变其__name__运行它作为__main__

默认情况下只的PyDev定期运行该文件,但你也可以问它通过它的计算模块名称来运行该文件(见preferences > PyDev > Run > Launch modules with "python -m mod.name")。

就个人而言,我建议你不要把相对进口在你的__main__模块中(因为那时用户将不能运行你的模块python filename.py,并且还必须使用-m标志运行),但如果这对您来说没问题,则可以在PyDev中启用该选项。

+0

我已经在pydev中启用了该功能。这也不是一个旨在作为'__main__'运行的文件,我只是想能够无误地运行它。如果没有简单的解决方法,我将按照我的意愿将它用作模块,就像@ user2357112建议的那样。 – Cole128

相关问题