鱼C论坛

 找回密码
 立即注册
查看: 625|回复: 4

[已解决]包导入问题

[复制链接]
发表于 2018-10-31 14:32:06 | 显示全部楼层 |阅读模式
50鱼币

这里假设在file0文件中有一个file1文件夹和一个主运行程序(a.py)
在file1文件夹中有一个file2文件夹file2中有一个b.py文件

要运行a文件
a文件中要导入b文件中的内容。

这里想到了两种:

1
在a文件中
import  file1.file2.b as b

2
分别在file1和file2文件中加入__init__.py
import  file1.file2.b as b

问题一:
我不理解这两种的区别在哪里
求大神赐教  

问题二:
在2假设下(加了__init__.py)
这里无法使用from file1.file2 import * 无法导入b
这是为什么





最佳答案
2018-10-31 14:32:07
首先要明确一个sys.path的概念
sys.path本质上是一个列表,里面的每一项是一个路径,包导入的时候,只能导入sys.path内路径里的.py文件。(可以打印一下sys.path看看里面都有什么)
sys.path里面包含了python安装目录下的模组目录,和你这个.py文件的本级目录,其他路径天然是没有的。如果想要导入你本级路径的父路径,以及本级路径的堂兄弟路径(就是你要在file1里面导入file2)需要在sys.path里面添加进父路径,这玩意用唬人的名词叫做“添加搜索路径”。
一般在a.py里面添加下面代码
  1. import os
  2. import sys

  3. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))   # file0的路径
  4. sys.path.append(BASE_DIR)   # 把file0添加进搜索路径
复制代码

当然找BASE_DIR还有别的方法,例如
  1. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  2. BASE_DIR = os.path.dirname(os.path.abspath('./'))
复制代码

然后就能再file1里面的py文件找到file2里面的py文件了

最佳答案

查看完整内容

首先要明确一个sys.path的概念 sys.path本质上是一个列表,里面的每一项是一个路径,包导入的时候,只能导入sys.path内路径里的.py文件。(可以打印一下sys.path看看里面都有什么) sys.path里面包含了python安装目录下的模组目录,和你这个.py文件的本级目录,其他路径天然是没有的。如果想要导入你本级路径的父路径,以及本级路径的堂兄弟路径(就是你要在file1里面导入file2)需要在sys.path里面添加进父路径,这玩意用唬人的 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-31 14:32:07 | 显示全部楼层    本楼为最佳答案   
首先要明确一个sys.path的概念
sys.path本质上是一个列表,里面的每一项是一个路径,包导入的时候,只能导入sys.path内路径里的.py文件。(可以打印一下sys.path看看里面都有什么)
sys.path里面包含了python安装目录下的模组目录,和你这个.py文件的本级目录,其他路径天然是没有的。如果想要导入你本级路径的父路径,以及本级路径的堂兄弟路径(就是你要在file1里面导入file2)需要在sys.path里面添加进父路径,这玩意用唬人的名词叫做“添加搜索路径”。
一般在a.py里面添加下面代码
  1. import os
  2. import sys

  3. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))   # file0的路径
  4. sys.path.append(BASE_DIR)   # 把file0添加进搜索路径
复制代码

当然找BASE_DIR还有别的方法,例如
  1. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  2. BASE_DIR = os.path.dirname(os.path.abspath('./'))
复制代码

然后就能再file1里面的py文件找到file2里面的py文件了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-31 15:24:17 | 显示全部楼层
你的init加不加区别不很大,一次成功导入后会自动加入pyc的init
init是让你的文件夹变成包来识别,
然后就是你import *导入了包,但是Init里面没有对路径导入做处理
可以参照楼上的,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-31 16:09:55 | 显示全部楼层
。。。感觉不好解释,给你篇文章,是讲包和模块的
https://blog.csdn.net/zyz511919766/article/details/22678143
我这里只是简单给你讲个概念,你看完再看这篇文章,模块就是py文件,包就是一个里面有__init__.py文件的文件夹
from xxx import *   # 实际上是 载入所有对象到当前名字空间
你执行上面这个语句,实际上执行的是包里面的__init__.py文件,为空就是,其实啥也没干
另外,你自己写一个包的时候,是需要在sys.path里面把当前的包路径添加到系统环境变量的,具体方法楼上讲了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-1 12:02:58 | 显示全部楼层
厉害厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表