Python3.5从子目录导入不';行不通

Python3.5从子目录导入不';行不通,python,python-import,Python,Python Import,我有一堆python脚本,只想通过将它们中的大多数放入子目录来构造它们。但是,当我尝试从子目录加载脚本时,python会给我不同的错误消息,这取决于我尝试导入子目录脚本的方式 我的细分曲面如下所示: io ├── dataset_creator.py └── read_data.py python3 -c 'from read_data import hello_world' 在来自父目录的脚本中,当我 from io import dataset_creator 出现以下错误: Impo

我有一堆python脚本,只想通过将它们中的大多数放入子目录来构造它们。但是,当我尝试从子目录加载脚本时,python会给我不同的错误消息,这取决于我尝试导入子目录脚本的方式

我的细分曲面如下所示:

io
├── dataset_creator.py
└── read_data.py
python3 -c 'from read_data import hello_world'
在来自父目录的脚本中,当我

from io import dataset_creator
出现以下错误:

ImportError: cannot import name 'dataset_creator'
ImportError: No module named 'io.dataset_creator'; 'io' is not a package
当我这样做的时候

import io.dataset_creator
出现以下错误:

ImportError: cannot import name 'dataset_creator'
ImportError: No module named 'io.dataset_creator'; 'io' is not a package
我还将
\uuuu init\uuuuu.py
插入io/中,但没有任何帮助,也没有在io/中加入一个点,但运气不好。python文档说我应该添加
\uuuu init\uuuu.py
,然后基本上一切都应该正常工作(就我的解释而言)

有人能帮我吗?如果我遗漏了一些重要的信息,请告诉我,我会添加它

干杯, 雅各布

编辑:

正如你们中的许多人所说,io已经是python中的另一个包了,所以将我的io/重命名为不同的名称修复了这个问题(同时还有
\uuu init\uuuuuuuuuuuuuupy
)。非常感谢你!
我知道有多个正确答案,但是,我可以将其中一个标记为正确,对不起。

它可能失败,因为
io
已经是一个它可能失败,因为
io
已经是一个我在这里回答了一个类似的问题

将父路径附加到Pythonpath: 导入系统 sys.path.append(“/path/to/parentfolder”)

您可以使用
os.path.dirname(\uuu file\uuu)
获取文件的绝对路径,而不是硬编码路径

将_uuinit_uuuu.py添加到父文件夹和io文件夹中,使其成为python包而不是目录

导入模块:
导入io.dataset\u创建者作为dcreator

parent/
  -- app.py
  -- io/
      --dataset_creator.py
      --read_data.py
在你的app.py中:

import sys
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
import io.dataset_creator as dcreator

我在这里回答了一个类似的问题

将父路径附加到Pythonpath: 导入系统 sys.path.append(“/path/to/parentfolder”)

您可以使用
os.path.dirname(\uuu file\uuu)
获取文件的绝对路径,而不是硬编码路径

将_uuinit_uuuu.py添加到父文件夹和io文件夹中,使其成为python包而不是目录

导入模块:
导入io.dataset\u创建者作为dcreator

parent/
  -- app.py
  -- io/
      --dataset_creator.py
      --read_data.py
在你的app.py中:

import sys
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
import io.dataset_creator as dcreator

当我测试Python3.5.1时,这种情况也发生在我身上

将目录
io
重命名为其他目录(我使用了
my_io
)修复了该问题。这是我的测试用例:

main.py
my_io
├── module.py
└── something.py
当我更改目录名时,两个模块都正确导入。我建议您将
io
目录更改为类似的目录,以避免出现这种情况


我想这一定是因为一些名为
io
的内部Python模块发生了冲突。

当我测试Python 3.5.1时,我也遇到了这种情况

将目录
io
重命名为其他目录(我使用了
my_io
)修复了该问题。这是我的测试用例:

main.py
my_io
├── module.py
└── something.py
当我更改目录名时,两个模块都正确导入。我建议您将
io
目录更改为类似的目录,以避免出现这种情况


我想这一定是因为内部的Python模块名为
io
,它在某种程度上存在冲突。

这个名称
io
已经被使用了。因为它是解释器使用的非常基本的模块之一,所以在启动过程中,在任何代码运行之前,都会加载它。这意味着当Python看到您导入
io.dataset\u creator
的请求时,它已经在
sys.modules
中获得了一个
io
模块。由于该模块不是一个包,它不会尝试加载您在
io
包中编写的另一个子模块(即使您设置了模块搜索路径,使您的包位于标准库之前)


您应该重命名
io
包。一种选择是将其放入另一个包中(
mypackage.io.dataset\u creator
应该可以正常工作)。您也可以将名称
io
替换为更具体的名称(例如
myproject\u io
)。

名称
io
已被使用。因为它是解释器使用的非常基本的模块之一,所以在启动过程中,在任何代码运行之前,都会加载它。这意味着当Python看到您导入
io.dataset\u creator
的请求时,它已经在
sys.modules
中获得了一个
io
模块。由于该模块不是一个包,它不会尝试加载您在
io
包中编写的另一个子模块(即使您设置了模块搜索路径,使您的包位于标准库之前)


您应该重命名
io
包。一种选择是将其放入另一个包中(
mypackage.io.dataset\u creator
应该可以正常工作)。您也可以将名称
io
替换为更具体的名称(例如
myproject\u io
)。

重新创建问题:

mkdir io
touch dataset_creator.py
touch read_data.py
python3 -c 'from io import dataset_creator'
python3 -c 'import io.dataset_creator'
给出错误消息

解决方案:

mkdir io
touch dataset_creator.py
touch read_data.py
python3 -c 'from io import dataset_creator'
python3 -c 'import io.dataset_creator'
  • 创建另一个名为“io”的子目录,并将文件放在那里
  • 使用与“io”不同的名称,因为已存在同名的模块
  • 说明:

    mkdir io
    touch dataset_creator.py
    touch read_data.py
    python3 -c 'from io import dataset_creator'
    python3 -c 'import io.dataset_creator'
    
    您已经在io目录中,因此不需要指定“io”。您可以简单地执行以下操作:

    python3 -c 'import dataset_creator'
    python3 -c 'import read_data'
    
    在python文件中添加函数或类后:

    def hello_world():
        print("hello world")
    
    您可以这样导入:

    io
    ├── dataset_creator.py
    └── read_data.py
    
    python3 -c 'from read_data import hello_world'
    
    要在io模块保护伞下组织代码,请创建另一个io目录,如下所示,并使用它存储python代码:

    ia (parent dir where you do the import)
    ├── ia
    │   ├── dataset_creator.py
    │   └── read_data.py
    ├── .gitignore
    ├── requirements.txt
    ├── setup.py
    └── README.md
    
    python3 -c 'import ia.dataset_creator'
    

    注意:我将目录重命名为“ia”,并且已经存在一个“io”模块()。

    重新创建问题:

    mkdir io
    touch dataset_creator.py
    touch read_data.py
    python3 -c 'from io import dataset_creator'
    python3 -c 'import io.dataset_creator'
    
    给出错误消息

    解决方案:

    mkdir io
    touch dataset_creator.py
    touch read_data.py
    python3 -c 'from io import dataset_creator'
    python3 -c 'import io.dataset_creator'
    
  • 创建另一个名为“io”的子目录,并将文件放在那里
  • 使用与“i”不同的名称