轉載請注明出處: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命令時所在的路徑。
……(未完待續)