【原创】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()设置工作路径的变化而变化。


 

后续会根据情况放上测试例子:

 

一、目录结构

 

G:\\

​ ├── a【a文件夹】

  |        ├── a1.py【我们运行的文件】

  |        └── a2.py【我们试图导入的同目录下文件】

  |       

 └── b【b文件夹】

           └── b2.py【我们试图导入的非同目录下文件】

 

二、测试代码

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命令时所在的路径。

 

……(未完待续)

 

转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9390455.html

posted @ 2018-07-30 14:38  海上流星  阅读(2831)  评论(1编辑  收藏  举报