2016-07-27 21 views
0

我仍然习惯于构造python项目和相关导入,我认为我大部分都理解相对导入,直到我在Py3上测试时遇到问题。从相邻模块导入包在Py2中工作,但不在Py3中

我有一个项目,是结构如下所示:

scriptA.py 
package/__init__.py 
      scriptB.py 
      scriptC.py 

__init.py__包含以下内容:

from scriptB import functionB 
from scriptC import functionC 

scriptA在Py2.7 import package as _package作品,但未能对Py3.5与错误,ImportError: No module named 'scriptB'

如何以兼容Py2和3的方式导入package?为什么这是不同的?

我想这样做,但import .package as _package似乎并没有改变任何东西(仍然搞清楚何时使用... ...

+0

我认为你正在做一个隐含的相对导入,这在Py3中是不允许的。如果你从__future__中输入'import absolute_import',这应该关闭隐式的rel。也导入Py2,并引发与Py3相同的错误。 “使用点”如@pbreach所示是一个[显式相对导入](http://www.python.org/dev/peps/pep-0008/#imports)的示例,它与Py2/3兼容。使用明确的相对或绝对导入,而不是隐含的。 – pylang

回答

0

没有名为模块“scriptB”

看起来像一个路径错误检查你的路径语句 可以通过在开始菜单搜索栏中输入“system”来访问Windows中的路径语句,从那里你可以访问“环境变量”,其中之一是“路径”语句。看到允许Python脚本访问的不同目录。确保你的P那里列出了ython 3.x目录和Python 3.x/scripts目录。
路径声明中列出的文件有点像程序中的全局变量。如果Python 2和Python 3的目录中有相同的文件名,则可以访问不兼容的文件。我读过,有一个python启动器可以解决这个问题,这样你就可以在同一台计算机上运行多个版本的python。 现在我会测试通过 来查看这是否是您的问题 - 将路径语句复制到备份文件,然后 - 删除对python 2.x的引用, -reboot - 运行您的程序。 如果你想运行python的多个版本,请将原始路径语句复制回来并安装python启动器。

+0

感谢您的输入。你能更清楚吗?你的意思是检查sys.path,如果是的话,我正在检查。这是一条评论,不是答案。 – pbreach

0

所以问题是,在__init__.py进口应该是相对进口即:

from .scriptB import functionB 
from .scriptC import functionC 

我想这是导入模块和Python包之间的区别之一。看来在Py3.5中,相对导入需要明确完成,因此会引发错误。这是我的解释。不幸的是我在这个问题上的结构与我所遇到的问题不够接近,所以这并不能解决问题......但对此的更详细的(也许是准确的)答案仍然受到欢迎。

相关问题