在调试python程序的时候,如果稍稍复杂的程序,就会涉及到import的问题。一般情况下来说,import的包是通过pip安装的,所以不会有路径问题。但是,对于放在程序目录下面的自定义的文件,是如何import的呢?本文就说的是这个问题。

苏南大叔:python命令行下无法识别import路径的解决方案 - python-import
python命令行下无法识别import路径的解决方案(图7-1)

大家好,欢迎查看苏南大叔的博客,我是苏南大叔。本文的主要内容是:pythonimport自定义代码的问题。pycharm里面可以正常运行,但是如果在命令行里面执行的话,就不一定能够正确识别这些文件了。

本文测试环境:win10python@3.6.8pycharm@2021.3.2

测试代码

本文测试代码目录结构如下:

苏南大叔:python命令行下无法识别import路径的解决方案 - 测试代码目录解构
python命令行下无法识别import路径的解决方案(图7-2)

代码结构比较简单,一个文件是用于被import的,两个文件是用于演示主程序import的。其中一个位于代码根目录,另外一个位于子文件夹。而import语句,都是以根目录为基准进行import的。

测试结果

如果上述代码,在pycharm里面运行,两个主程序都能顺利import。但是,如果在命令行里面运行的话,只有位于代码根目录下的主程序是可以顺利import的,另外一个非代码根目录下面的主程序是报错的,报错如下:

Traceback (most recent call last):
  File "sub/run.py", line 1, in <module>
    import lib.func.function as a
ModuleNotFoundError: No module named 'lib'

苏南大叔的理解是这样的:在pycharm里面,import这个相对路径寻址,可以作为绝对路径使用。而在命令行下面,默认情况下,就只能当作相对路径了。
不能正常import的原因是:在pycharm里运行的时候,pycharm会把当前根目录添加到系列路径中,也就是sys.path之中。

苏南大叔:python命令行下无法识别import路径的解决方案 - 文件import寻址测试对比
python命令行下无法识别import路径的解决方案(图7-3)

而在命令行里面,并不能自动识别出代码的根目录,导致非根目录下的程序import的时候,并不能顺利import到相关代码。

临时解决方案

所以,临时解决方案就两个:
第一个临时方案就是:
pycharm类似的软件里面去运行相关代码,因为这个时候有个代码根目录的概念,所以会正常执行。

苏南大叔:python命令行下无法识别import路径的解决方案 - pycharm-run-py
python命令行下无法识别import路径的解决方案(图7-4)

第二个临时方案就是:
对于代码逻辑比较简单的代码来说,可以调整一下import代码路径或者主程序的位置,也就是说捋顺一下相对关系。当然,import语句里面并不能体现../这种路径,所以修改主程序的位置,似乎是上选。

苏南大叔:python命令行下无法识别import路径的解决方案 - 相对路径
python命令行下无法识别import路径的解决方案(图7-5)

解决方案(推荐)

对于主程序来说,第一时间把根目录路径注册到sys.path下面,似乎是更好的方案。代码如下:

import os.path
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

核心代码如下:

os.path.dirname(__file__)

这个主程序距离实际的代码根目录有几层,就有几句os.path.dirname()。当然,如果您着急,直接写真实路径,也行。或者可以加个循环os.path.dirname()是非常好的主意。

import os.path
import sys
tmp = __file__
x = 2
for i in range(x):
    tmp = os.path.dirname(tmp)
sys.path.append(tmp)

其中的x就表示距离根目录有几层,请根据实际情况替换。

苏南大叔:python命令行下无法识别import路径的解决方案 - 注册根目录路径
python命令行下无法识别import路径的解决方案(图7-6)

对于多个代码杂合到一起的项目,import的路径可能有不同的根目录。不同的源码部分,会有不同的import起始点,这个时候,就可以把这些多个项目的根目录,都注册到sys.path中,记得相关代码写到import语句之前即可。如果考虑严谨一些的话,还可以考虑文件同名,加载顺序的问题。不过,按理说实际情况中遇到的概率不大。

查看import的默认路径

import sys
for _ in sys.path:
    print(_)

上述代码可以查看sys.path的设置,大家可以自行验证相关猜想。

苏南大叔:python命令行下无法识别import路径的解决方案 - 检测sys
python命令行下无法识别import路径的解决方案(图7-7)

相关文章

苏南大叔写过的一些python文章,链接如下:

总结

以后苏南大叔的文章,尽量简洁(至少第一次发布的时候是这样的,哈哈)。如果大家觉得那篇文章话比较多,可能就是心情好,或者思路乱,或者为了seo啥的目的了。

写个python的链接,如下:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。