python命令行下无法识别import路径的解决方案
发布于 作者:苏南大叔 来源:程序如此灵动~在调试python
程序的时候,如果稍稍复杂的程序,就会涉及到import
的问题。一般情况下来说,import
的包是通过pip
安装的,所以不会有路径问题。但是,对于放在程序目录下面的自定义的文件,是如何import
的呢?本文就说的是这个问题。
大家好,欢迎查看苏南大叔的博客,我是苏南大叔。本文的主要内容是:python
的import
自定义代码的问题。pycharm
里面可以正常运行,但是如果在命令行里面执行的话,就不一定能够正确识别这些文件了。
本文测试环境:win10
,python@3.6.8
,pycharm@2021.3.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
之中。
而在命令行里面,并不能自动识别出代码的根目录,导致非根目录下的程序import
的时候,并不能顺利import
到相关代码。
临时解决方案
第一个临时方案就是:
在pycharm
类似的软件里面去运行相关代码,因为这个时候有个代码根目录的概念,所以会正常执行。
第二个临时方案就是:
对于代码逻辑比较简单的代码来说,可以调整一下import
代码路径或者主程序的位置,也就是说捋顺一下相对关系。当然,import
语句里面并不能体现../
这种路径,所以修改主程序的位置,似乎是上选。
解决方案(推荐)
对于主程序来说,第一时间把根目录路径注册到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
就表示距离根目录有几层,请根据实际情况替换。
对于多个代码杂合到一起的项目,import
的路径可能有不同的根目录。不同的源码部分,会有不同的import
起始点,这个时候,就可以把这些多个项目的根目录,都注册到sys.path
中,记得相关代码写到import
语句之前即可。如果考虑严谨一些的话,还可以考虑文件同名,加载顺序的问题。不过,按理说实际情况中遇到的概率不大。
查看import的默认路径
import sys
for _ in sys.path:
print(_)
上述代码可以查看sys.path
的设置,大家可以自行验证相关猜想。
相关文章
苏南大叔写过的一些python
文章,链接如下:
总结
以后苏南大叔的文章,尽量简洁(至少第一次发布的时候是这样的,哈哈)。如果大家觉得那篇文章话比较多,可能就是心情好,或者思路乱,或者为了seo
啥的目的了。
写个python
的链接,如下:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。