2017-02-09 94 views
1

我有一大堆的Python脚本,并只是想通过把大多数人的子目录来构建他们。但是,当我尝试从子目录加载脚本时,python给了我不同的错误消息,这取决于我如何导入子目录脚本。Python3.5进口不起作用

我子目录看起来是这样的:

io 
├── dataset_creator.py 
└── read_data.py 

从父目录我的剧本,当我做

from io import dataset_creator 

此错误时:

ImportError: cannot import name 'dataset_creator' 

当我做

import io.dataset_creator 
012发生

此错误:

ImportError: No module named 'io.dataset_creator'; 'io' is not a package 

我也感动__init__.py到IO /但它并没有在所有帮助,以及前述点到IO /,但没有运气。 python文档说,我应该添加__init__.py,然后一切都应该工作,基本上(据我解释)。

任何人都可以帮助我吗?如果我遗漏了一些重要信息,请告诉我,我会添加它。

干杯, 雅各布

编辑:

正如你们许多人指出,IO已经是另一个包在Python,所以重命名我的IO /不同的解决了这一问题事(同时还具有__init__.py) 。非常感谢你! 我知道有多个正确的答案,但是,我可以将其中一个标记为正确,对不起。

+0

''io'不是一个包'。提示:在Python中,什么是包? – 2017-02-09 17:44:00

+0

缺少'__init __。py'? – yedpodtrzitko

+0

我的文件夹的名称是io – StrawHat

回答

1

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

您应该重命名您的io包。一种选择是把它放在另一个包里(mypackage.io.dataset_creator应该可以正常工作)。您也可以将名称io更换为更具体的名称(例如myproject_io)。

0

我已经回答了这里Using exec on a file in a different directory causes module import errors

类似的问题追加父路径PYTHONPATH: import sys sys.path.append("/path/to/parentfolder")

您可以使用os.path.dirname(__file__)来获取除硬编码路径以外的文件绝对路径。

__init__.py添加到您的父文件夹和文件IO,使得它比其他目录Python包。

导入模块: import io.dataset_creator as 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 
0

这发生在我身上,以及关于Python 3.5.1,当我进行了测试。

将目录io重命名为别的东西(我用my_io)修复了这个问题。这里是我的测试案例:

main.py 
my_io 
├── module.py 
└── something.py 

正确导入时我改变了目录的名称这两个模块。我建议你将io目录更改为类似的内容以避免这种情况。

我认为这必须与一些内部的Python模块io有冲突。

0

重塑问题:

mkdir io 
touch dataset_creator.py 
touch read_data.py 
python3 -c 'from io import dataset_creator' 
python3 -c 'import io.dataset_creator' 

给人的错误消息。

解决方案:

  1. 创建一个名为 “IO” 的另一个子目录,并把那里的文件。
  2. 使用与“io”不同的名称,因为该名称的模块已存在。

说明:

您已经在IO目录,所以你不需要指定 “IO”。你可以简单地做:

python3 -c 'import dataset_creator' 
python3 -c 'import read_data' 

而一旦你在你的Python文件添加一个函数或类:

def hello_world(): 
    print("hello world") 

可以导入这样的:

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”模块(ref)。