【原創】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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM