【问题标题】:Import error in Python 3 but works with Python 2Python 3 中的导入错误,但适用于 Python 2
【发布时间】:2016-12-10 04:05:54
【问题描述】:

我想使用 Python v3.5.2,但我的笔记本电脑也安装了 Python 2.7.10(它是 MacBook)。我有一个简单的 Python 项目结构,如下所示。请注意,由于我使用 IntelliJ 作为 IDE(例如 *.pyc 文件和 *.iml 文件),可能会显示一些工件。

. ├── io │   ├── __init__.py │   ├── __init__.pyc │   ├── __pycache__ │   │   └── __init__.cpython-35.pyc │   └── 我 │   ├── __init__.py │   ├── __init__.pyc │   └── 型号 │   ├── __init__.py │   ├── __init__.pyc │   ├── car.py │   └── car.pyc ├── start.py └── test-python.iml

我的start.py 脚本如下所示。

from io.me.model.car import Car

car = Car("honda", "civic", 2005)
print(car.model)

在终端中,如果我输入python3 start.py,则会收到以下错误。

回溯(最近一次通话最后): 文件“start.py”,第 1 行,在 从 io.me.model.car 导入汽车 ImportError:没有名为“io.me”的模块; 'io' 不是一个包

但是,我决定输入python start.py,我确实得到了输出:civic

关于我在这里做错了什么有什么想法吗?

另外,是否有关于 Python 项目结构的指南?来自 Java 世界,我想知道对于 Python 项目的结构(例如典型的 Java Maven 项目)是否有推荐的最佳实践或高度评价的方法。

  • 我将来源放在哪里?
  • 我在哪里进行测试?
  • 是否有用于 Python 的构建工具(如 Java 的 Maven)可以促进和指导目录结构?

【问题讨论】:

  • io 重命名为其他名称。可能是它与内置的 io 包冲突。
  • @MohammadYusufGhazi 您的建议有效。所以,正如我所说,我来自 Java 世界,我的问题是,仅仅因为已经有一个使用 io 的包,没有其他人可以创建以该命名空间开头的包吗?例如io.mydomain.project?在 Java 中,您可以共享一个 io 命名空间,尽管您希望获得更具体的信息,但可以使用 io
  • 尝试像这样导入。 from .io.me.model.car import Car。看看这是否有效。它将从当前目录导入io 包。
  • 你可以阅读this opinionated guide

标签: python python-2.7 python-3.x python-module


【解决方案1】:

python 中有一个名为 io 的内置模块。还要在文件夹io所在的目录下添加__init__.py

Python2 中的输出

>>>
>>> import io
>>>
>>>
>>> dir(io)
['BlockingIOError', 'BufferedIOBase', 'BufferedRWPair', 'BufferedRandom', 'BufferedReader', 'BufferedWriter', 'BytesIO', 'DEFAULT_BUFFER_SIZE', 'FileIO', 'IOBase', 'IncrementalNewlineDecoder', 'OpenWrapper', 'RawIOBase', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'StringIO', 'TextIOBase', 'TextIOWrapper', 'UnsupportedOperation', '__all__', '__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_io', 'abc', 'open']
>>>

Python3 中的输出

Python 3.4.5 (default, Oct 10 2016, 14:41:48)
[GCC 5.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import io
>>>
>>> dir(io)
['BlockingIOError', 'BufferedIOBase', 'BufferedRWPair', 'BufferedRandom', 'BufferedReader', 'BufferedWriter', 'BytesIO', 'DEFAULT_BUFFER_SIZE', 'FileIO', 'IOBase', 'IncrementalNewlineDecoder', 'OpenWrapper', 'RawIOBase', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'StringIO', 'TextIOBase', 'TextIOWrapper', 'UnsupportedOperation', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_io', 'abc', 'open']
>>>

将您的 io 包重命名为其他名称。

【讨论】:

  • 在子目录io 中已经有一个__init__.py 文件(参见上面tree 命令的输出)。但是,这个__init__.py 文件是空的。有问题吗?
  • __init__.py 只是将其作为一个包的一种方式。为空没有问题。
  • 所以,我似乎不能使用io 命名空间,对吧?因为当我只是将该目录 io 重命名为其他内容时,例如ioioio,然后针对 start.py 运行 Python 3 命令即可。
  • 不建议使用python内置的包。
  • 好的,我现在明白了。能否也请您回答我的其他问题?我刚开始使用 Python,我想用我的项目结构和构建管理来做这件事。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2018-01-23
  • 2016-04-26
  • 1970-01-01
  • 2016-02-04
相关资源
最近更新 更多