Python3.5从子目录导入不';行不通
我有一堆python脚本,只想通过将它们中的大多数放入子目录来构造它们。但是,当我尝试从子目录加载脚本时,python会给我不同的错误消息,这取决于我尝试导入子目录脚本的方式 我的细分曲面如下所示: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
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'
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'