语法

Python-import导入上级目录文件

假设有如下目录结构:

– dir0
 | file1.py
 | file2.py
 | dir3
 | file3.py
 | dir4
 | file4.py

dir0文件夹下有file1.py、file2.py两个文件和dir3、dir4两个子文件夹,dir3中有file3.py文件,dir4中有file4.py文件。

1.导入同级模块

python导入同级模块(在同一个文件夹中的py文件)直接导入即可。

import xxx

如在file1.py中想导入file2.py,注意无需加后缀”.py”;

import file2

使用file2中函数时需加上前缀”file2.”,即:

file2.fuction_name()

2.导入下级模块

导入下级目录模块也很容易,需在下级目录中新建一个空白的__init__.py文件再导入:

from dirname import xxx
如在file1.py中想导入dir3下的file3.py,首先要在dir3中新建一个空白的__init__.py文件。

– dir0
 | file1.py
 | file2.py
 | dir3
 | init.py
 | file3.py
 | dir4
 | file4.py

再使用如下语句:

  • plan A

    from dir3 import file3
  • plan B

    import dir3.file3
    # import dir3.file3 as df3

    但使用第二种方式则下文需要一直带着路径dir3书写,较为累赘,建议可以另起一个别名。

3.导入上级模块

要导入上级目录下模块,可以使用sys.path:  

import sys
sys.path.append("..")
import xxx 

如:在file4.py中想引入import上级目录下的file1.py:

import sys
sys.path.append("..")
import file1

sys.path的作用:当使用import语句导入模块时,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块,所以这里是直接把上级目录加到了sys.path里。

“..”的含义:等同于linux里的’..’,表示当前工作目录的上级目录。实际上python中的’.’也和linux中一致,表示当前目录。

4.导入隔壁文件夹下的模块

如在file4.py中想引入import在dir3目录下的file3.py。

这其实是前面两个操作的组合,其思路本质上是将上级目录加到sys.path里,再按照对下级目录模块的方式导入。
同样需要被引文件夹也就是dir3下有空的__init__.py文件。

– dir
 | file1.py
 | file2.py
 | dir3
 | init.py
 | file3.py
 | dir4
 | file4.py

同时也要将上级目录加到sys.path里:

import sys
sys.path.append("..")
from dir3 import file3

5.常见错误及import原理

在使用直接从上级目录引入模块的操作时:
from .. import xxx
经常会报错:
ValueError: attempted relative import beyond top-level package

这是由于相对导入时,文件夹实质上充当的是package,也就是包的角色(比如我们常用的numpy、pandas都是包)。如果python解释器没有认同该文件夹是package,那么这就是一个普通的文件夹,无法实现相对导入。

文件夹作为package需要满足如下两个条件:

  • 文件夹中必须存在有__init__.py文件,可以为空。

  • 不能作为顶层模块来执行该文件夹中的py文件。

报错

Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-Cc2yuK/pip/

报错如下图所示:

一般出现这个问题是由于pip版本太低或者pip有问题的原因

此时需要升级pip:

  • pip3执行
pip3 install --upgrade pip
  • pip执行
pip install --upgrade pip
  • 如果上面升级失败,可以试试:
python -m pip install --upgrade --force pip

解决方法1:
如果在升级过程中报标题中的错误,则通过gt-pip.py文件进行安装(以python2.7为例):
先卸载安装的python-pip

sudo yum remove python-pip

下载get-pip.py文件

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python get-pip.py

解决方法2:
这种方法是在网上看到的,没有亲自试验,请自行尝试:
如果安装了python2-pip或者python-pip,先卸载

yum -y remove python2-pip python-pip

安装python2-pip

yum -y install python2-pip

安装zabbix-api

pip install zabbix-api

UserWarning: loaded more than 1 DLL from .libs

出现这个报错说明在你安装新的软件,或者更新numpy或者干什么的时候,旧的numpy没有卸载掉,两版numpy导致出现冲突.

解决办法:
1.进入cmd 卸载掉numpy:pip uninstall numpy
2.重新安装numpy:pip install numpy
3.此时若numpy不可用,查看.libs文件夹,删除掉其中的另一个dll文件,应该可用

在使用pip install jupyter命令安装jupyter后,然后在cmd终端中输入“jupyter notebook”后,提示'jupyter-notebook' not found

解决办法:
添加环境变量

注:如不能解决见下一报错

进入jupyter notebook报错,显示 No module named ‘pysqlite2’

查看对应的sessionmanager.py文件的对应报错位置,发现只有当无法import sqlite3时才会执行该句,所以问题症结出现在缺失sqlite3插件。结合在命令行所看到的【DLL load failed:找不到指定的程序】,所以可能不是缺失sqlite3包,而是缺失sqlite3所需要的dll文件。

解决方法:

1、去sqlite3官网,根据自己的系统和位数(32位还是64位)下载对应的插件:
sqlite3官网地址:https://www.sqlite.org/download.html

如果是64位Windows系统,则上图三个中的第二个插件。
2、下载完后,解压缩,将文件复制到Anaconda的DLLs目录下即可;
3、测试是否解决问题
在命令行输入juputer notebook,成功运行,问题解决。

Anaconda

Anaconda 换国内源

清华源

在cmd 命令行中,输入添加以下命令(前提是要安装了Anaconda包管理工具)
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config –set show_channel_urls yes

中科大源

与上述操作一样,在cmd命令行进行安装
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config –set show_channel_urls yes

恢复默认源

在cmd命令行使用下列命令即可
conda config –remove-key channels

查看源

conda config –show
查看channels,出现了上述添加的过程则证明换成功了。

一些问题 :
如果还是无法安装第三方库或者很慢,则观察自己的源是否为上述添加的源,如果还夹杂着别的源,先进行恢复默认源(上述操作),然后再进行添加国内源(上述操作)。

pip

升级所有包

import pkg_resources
from subprocess import call

for packages in [dist.project_name for dist in pkg_resources.working_set]:
    call("pip3 install --upgrade " + ''.join(packages) + ' --user', shell=True)

Jupyter Notebook