【原创】os.chdir设置的工作路径和sys.path之间到底是个啥关系?
转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9390455.html
直接放上测试后的结论(测试代码和截图过多,有兴趣的小伙伴可自己测试,未来看情况更新本篇博客):
★这里仅仅讨论os.chdir()设置的工作路径在模块导入方面的问题,而非可读写文件的问题。
事实上,读写文件始终是统一的规则,即:有效的文件读写路径(直接用文件名来open)只与当前工作路径有关,与sys.path无关,与py文件所在当前目录也无关。
★这里仅仅讨论在执行py脚本中的os.chdir()语句,而非控制台下未指定py文件时设置的工作路径(毕竟开放环境下我们的工程实施不常用)
★默认的工作路径:
1、在windows控制台:
默认是运行python命令时的路径
2、在pycharm下:
默认是当前py文件所在目录
3、在控制台直接运行ipython:
默认是当前py文件所在的目录
4、spyder:
默认是右上角可选框中显示的目录
★在不同环境下,os.chdir()的效力好像不一样(有的会影响到sys.path,有的不会),但模块导入的原则始终是按sys.path列表中的路径来找的。
1、在windows控制台和pycharm下:
这里os.chdir()设置的工作路径仅仅是文件读写路径(就是直接用文件名来open,有效的文件读写路径),但是不会更改sys.path第一个元素指向的模块导入路径(当前文件所在目录)。因此即使通过os.chdir()设置了工作路径,也无法从新的工作路径中导入模块,仍然只能导入sys.path中路径下的模块(即可以导入当前文件所在目录下的模块);
2、在控制台直接运行ipython:
结果ipython是会默认将当前工作路径也作为模块导入的读取路径之一的(添加到了sys.path,会随着ipython的工作路径变化,动态变化),当然当前目录仍然在sys.path列表中(第一个元素)。此时,既可以从当前目录导入模块,又可以
3、测试了下spyder:
会默认将sys.path的第一个元素 指向 工作路径,也就是说此时os.chdir()设置的工作路径其实就是在操作修改sys.path中的第一个元素指向,因此模块导入的查询路径会跟随os.chdir()设置工作路径的变化而变化。
后续会根据情况放上测试例子:
一、目录结构
二、测试代码
1、在控制台操作:
【首先确认控制台运行python的话,默认工作路径是什么?】
当前a1.py内的代码为:
import os print(os.getcwd()) os.chdir("G:\\b") print(os.getcwd())
①在 G:\\ 下控制台输入:
G:\> python a/a1.py
执行结果为:
G:\
G:\b
换种形式来操作:
②仍然在控制台输入:
G:\>cd a G:\a>python Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.getcwd() 'G:\\a' >>> os.chdir('G:\\b') >>> os.getcwd() 'G:\\b'
这里可以看出:在windows控制台中运行python脚本,默认工作路径就是运行python命令时所在的路径。
……(未完待续)