python模塊搜索路徑
① 解決python開發中模塊沖突的具體方法
假如有兩個同名的模塊,那麼只能導入它們中的一個——默認情況下,Python總是會選擇在模塊搜索路徑sys.path中最左邊的那一項。如果你偏愛的模塊和頂層腳本在同一目錄下,那就不成問題;由於頂層腳本的主目錄總是模塊搜索路徑中的第一項,因此它的內容總是會首先被自動定位。然而對於跨目錄的導入,模塊搜索路徑的線性本質意味著同名的文件會產生沖突。
要修復這一沖突,要麼避免同名文件。如果你需要同時訪問兩個同名的文件,那麼就要把兩個源文件分族陵飢別放入子目錄中,這樣包導入目錄名稱將使得模塊引用唯一。只要外圍的包目錄名稱是唯一的,你就能訪問兆返同名模塊中的任意一個,或是全部的兩個。注意,如果你不小心為自己的模塊使用了一個名稱,而它碰巧和你需要使用的標准庫模塊的名稱相同,那麼也汪拿會出現這一問題。這是因為程序主目錄(或是模塊路徑中靠前的另一個目錄)下的本地模塊會隱藏和替換標准庫模塊。要修復這種覆蓋,要麼避免使用和你需要的另一模塊相同的名稱,要麼把模塊放到一個包目錄下然後使用Python 3.X的包相對導入模型(包相對導入在2.X版本中是一個可選的功能)。在包相對導入模型下,普通導入會跳過包目錄,因此你可以獲取標准庫版本,但在必要時特殊的點號開頭導入語句仍然可以選取同名模塊的本地版本。
② 如何設置python模塊的默認搜索路徑
Python的模塊搜索路徑PYTHONPATH類似Java的CLASSPATHx0dx0a由以下路徑組合而成,通過更改以下4者其中之一都可以改變Python模塊的默認搜索路徑:x0dx0a1.當前工作目錄x0dx0a2.操作系統的PYTHONPATH環境變數x0dx0a3.Python安裝目錄lib/site-packages中或PYTHONPATH中的.pth文件定義的路徑x0dx0a如:find~/my_lib-typed-print>~/python2.6/site-packages/my_lib.pthx0dx0a4.運行時對sys.path的改變,如:x0dx0ax0dx0a向後增加:x0dx0asys.path.append(path)x0dx0apath不要以/或\結尾。x0dx0a向前增加:x0dx0asys.path.insert(0,path)
③ python 基礎教程
運算
a = 21
b = 10
c = 0
c = a + b
print "1 - c 的值為:", c
c = a - b
print "2 - c 的值為:", c
c = a * b
print "3 - c 的值為:", c
c = a / b
print "4 - c 的值為:", c
c = a % b
print "5 - c 的值為:", c
a = 2
b = 3
c = a**b
print "6 - c 的值為:", c
a = 10
b = 5
c = a//b
print "7 - c 的值為:", c
python比較
a = 21
b = 10
c = 0
if ( a == b ):
print "1 - a 等於 b"
else:
print "1 - a 不等於 b"
if ( a != b ):
print "2 - a 不等於 b"
else:
print "2 - a 等於 b"
if ( a <> b ):
print "3 - a 不等於 b"
else:
print "3 - a 等於 b"
if ( a < b ):
print "4 - a 小於 b"
else:
print "4 - a 大於等於 b"
if ( a > b ):
print "5 - a 大於 b"
else:
print "5 - a 小於等於 b"
a = 5
b = 20
if ( a <= b ):
print "6 - a 小於等於 b"
else:
print "6 - a 大於 b"
if ( b >= a ):
print "7 - b 大於等於 a"
else:
print "7 - b 小於 a"
賦值
a = 21
b = 10
c = 0
c = a + b
print "1 - c 的值為:", c
c += a
print "2 - c 的值為:", c
c *= a
print "3 - c 的值為:", c
c /= a
print "4 - c 的值為:", c
c = 2
c %= a
print "5 - c 的值為:", c
c **= a
print "6 - c 的值為:", c
c //= a
print "7 - c 的值為:", c
邏輯運算符:
a = 10
b = 20
if ( a and b ):
print "1 - 變數 a 和 b 都為 true"
else:
print "1 - 變數 a 和 b 有一個不為 true"
if ( a or b ):
print "2 - 變數 a 和 b 都為 true,或其中一個變數為 true"
else:
print "2 - 變數 a 和 b 都不為 true"
a = 0
if ( a and b ):
print "3 - 變數 a 和 b 都為 true"
else:
print "3 - 變數 a 和 b 有一個不為 true"
if ( a or b ):
print "4 - 變數 a 和 b 都為 true,或其中一個變數為 true"
else:
print "4 - 變數 a 和 b 都不為 true"
if not( a and b ):
print "5 - 變數 a 和 b 都為 false,或其中一個變數為 false"
else:
print "5 - 變數 a 和 b 都為 true"
in,not in
a = 10
b = 20
list = [1, 2, 3, 4, 5 ];
if ( a in list ):
print "1 - 變數 a 在給定的列表中 list 中"
else:
print "1 - 變數 a 不在給定的列表中 list 中"
if ( b not in list ):
print "2 - 變數 b 不在給定的列表中 list 中"
else:
print "2 - 變數 b 在給定的列表中 list 中"
a = 2
if ( a in list ):
print "3 - 變數 a 在給定的列表中 list 中"
else:
print "3 - 變數 a 不在給定的列表中 list 中"
條件
flag = False
name = 'luren'
if name == 'python': # 判斷變數否為'python'
flag = True # 條件成立時設置標志為真
print 'welcome boss' # 並輸出歡迎信息
else:
print name
num = 5
if num == 3: # 判斷num的值
print 'boss'
elif num == 2:
print 'user'
elif num == 1:
print 'worker'
elif num < 0: # 值小於零時輸出
print 'error'
else:
print 'roadman' # 條件均不成立時輸出
循環語句:
count = 0
while (count < 9):
print 'The count is:', count
count = count + 1
print "Good bye!"
i = 1
while i < 10:
i += 1
if i%2 > 0: # 非雙數時跳過輸出
continue
print i # 輸出雙數2、4、6、8、10
i = 1
while 1: # 循環條件為1必定成立
print i # 輸出1~10
i += 1
if i > 10: # 當i大於10時跳出循環
break
for letter in 'Python': # 第一個實例
print '當前字母 :', letter
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 第二個實例
print '當前水果 :', fruit
print "Good bye!"
獲取用戶輸入:raw_input
var = 1
while var == 1 : # 該條件永遠為true,循環將無限執行下去
num = raw_input("Enter a number :")
print "You entered: ", num
print "Good bye!"
range,len
fruits = ['banana', 'apple', 'mango']
for index in range(len(fruits)):
print '當前水果 :', fruits[index]
print "Good bye!"
python數學函數:
abs,cell,cmp,exp,fabs,floor,log,log10,max,min,mod,pow,round,sqrt
randrange
訪問字元串的值
var1 = 'Hello World!'
var2 = "Python Runoob"
print "var1[0]: ", var1[0]
print "var2[1:5]: ", var2[1:5]
轉義字元
格式化輸出
print "My name is %s and weight is %d kg!" % ('Zara', 21)
字元串函數:
添加元素
list = [] ## 空列表
list.append('Google') ## 使用 append() 添加元素
list.append('Runoob')
print list
刪除元素
list1 = ['physics', 'chemistry', 1997, 2000]
print list1
del list1[2]
print "After deleting value at index 2 : "
print list1
列表操作
列表方法
刪除字典
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
del dict['Name']; # 刪除鍵是'Name'的條目
dict.clear(); # 清空詞典所有條目
del dict ; # 刪除詞典
print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
字典的函數:
當前時間戳:
import time
time.time()
格式化日期輸出
import time
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
a = "Sat Mar 28 22:24:24 2016"
print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))
獲取某個月日歷:calendar
import calendar
cal = calendar.month(2016, 1)
print "以下輸出2016年1月份的日歷:"
print cal
當前日期和時間
import datetime
i = datetime.datetime.now()
print ("當前的日期和時間是 %s" % i)
print ("ISO格式的日期和時間是 %s" % i.isoformat() )
print ("當前的年份是 %s" %i.year)
print ("當前的月份是 %s" %i.month)
print ("當前的日期是 %s" %i.day)
print ("dd/mm/yyyy 格式是 %s/%s/%s" % (i.day, i.month, i.year) )
print ("當前小時是 %s" %i.hour)
print ("當前分鍾是 %s" %i.minute)
print ("當前秒是 %s" %i.second)
不定長參數:*
lambda:匿名函數
def....
python模塊搜索路徑
獲取用戶輸入
str = raw_input("請輸入:")
print "你輸入的內容是: ", str
input可以接收表達式
open參數
write要自己添加換行符
讀取10個字元
重命名:os.rename
os.remove
os.mkdir os.chdir
os.getcwd
os.rmdir
open參數
file的方法
異常:
try:
fh = open("testfile", "w")
fh.write("這是一個測試文件,用於測試異常!!")
except IOError:
print "Error: 沒有找到文件或讀取文件失敗"
else:
print "內容寫入文件成功"
fh.close()
try:
fh = open("testfile", "w")
fh.write("這是一個測試文件,用於測試異常!!")
finally:
print "Error: 沒有找到文件或讀取文件失敗"
用戶自定義異常:
os 模塊提供了非常豐富的方法用來處理文件和目錄。常用的方法如下表所示:
| 序號 | 方法及描述 |
| 1 |
os.access(path, mode)
檢驗許可權模式 |
| 2 |
os.chdir(path)
改變當前工作目錄 |
| 3 |
os.chflags(path, flags)
設置路徑的標記為數字標記。 |
| 4 |
os.chmod(path, mode)
更改許可權 |
| 5 |
os.chown(path, uid, gid)
更改文件所有者 |
| 6 |
os.chroot(path)
改變當前進程的根目錄 |
| 7 |
os.close(fd)
關閉文件描述符 fd |
| 8 |
os.closerange(fd_low, fd_high)
關閉所有文件描述符,從 fd_low (包含) 到 fd_high (不包含), 錯誤會忽略 |
| 9 |
os.p(fd)
復制文件描述符 fd |
| 10 |
os.p2(fd, fd2)
將一個文件描述符 fd 復制到另一個 fd2 |
| 11 |
os.fchdir(fd)
通過文件描述符改變當前工作目錄 |
| 12 |
os.fchmod(fd, mode)
改變一個文件的訪問許可權,該文件由參數fd指定,參數mode是Unix下的文件訪問許可權。 |
| 13 |
os.fchown(fd, uid, gid)
修改一個文件的所有權,這個函數修改一個文件的用戶ID和用戶組ID,該文件由文件描述符fd指定。 |
| 14 |
os.fdatasync(fd)
強制將文件寫入磁碟,該文件由文件描述符fd指定,但是不強制更新文件的狀態信息。 |
| 15 |
os.fdopen(fd[, mode[, bufsize]])
通過文件描述符 fd 創建一個文件對象,並返回這個文件對象 |
| 16 |
os.fpathconf(fd, name)
返回一個打開的文件的系統配置信息。name為檢索的系統配置的值,它也許是一個定義系統值的字元串,這些名字在很多標准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
| 17 |
os.fstat(fd)
返迴文件描述符fd的狀態,像stat()。 |
| 18 |
os.fstatvfs(fd)
返回包含文件描述符fd的文件的文件系統的信息,像 statvfs() |
| 19 |
os.fsync(fd)
強制將文件描述符為fd的文件寫入硬碟。 |
| 20 |
os.ftruncate(fd, length)
裁剪文件描述符fd對應的文件, 所以它最大不能超過文件大小。 |
| 21 |
os.getcwd()
返回當前工作目錄 |
| 22 |
os.getcw()
返回一個當前工作目錄的Unicode對象 |
| 23 |
os.isatty(fd)
如果文件描述符fd是打開的,同時與tty(-like)設備相連,則返回true, 否則False。 |
| 24 |
os.lchflags(path, flags)
設置路徑的標記為數字標記,類似 chflags(),但是沒有軟鏈接 |
| 25 |
os.lchmod(path, mode)
修改連接文件許可權 |
| 26 |
os.lchown(path, uid, gid)
更改文件所有者,類似 chown,但是不追蹤鏈接。 |
| 27 |
os.link(src, dst)
創建硬鏈接,名為參數 dst,指向參數 src |
| 28 |
os.listdir(path)
返回path指定的文件夾包含的文件或文件夾的名字的列表。 |
| 29 |
os.lseek(fd, pos, how)
設置文件描述符 fd當前位置為pos, how方式修改: SEEK_SET 或者 0 設置從文件開始的計算的pos; SEEK_CUR或者 1 則從當前位置計算; os.SEEK_END或者2則從文件尾部開始. 在unix,Windows中有效 |
| 30 |
os.lstat(path)
像stat(),但是沒有軟鏈接 |
| 31 |
os.major(device)
從原始的設備號中提取設備major號碼 (使用stat中的st_dev或者st_rdev field)。 |
| 32 |
os.makedev(major, minor)
以major和minor設備號組成一個原始設備號 |
| 33 |
os.makedirs(path[, mode])
遞歸文件夾創建函數。像mkdir(), 但創建的所有intermediate-level文件夾需要包含子文件夾。 |
| 34 |
os.minor(device)
從原始的設備號中提取設備minor號碼 (使用stat中的st_dev或者st_rdev field )。 |
| 35 |
os.mkdir(path[, mode])
以數字mode的mode創建一個名為path的文件夾.默認的 mode 是 0777 (八進制)。 |
| 36 |
os.mkfifo(path[, mode])
創建命名管道,mode 為數字,默認為 0666 (八進制) |
| 37 |
os.mknod(filename[, mode=0600, device])
創建一個名為filename文件系統節點(文件,設備特別文件或者命名pipe)。
|
| 38 |
os.open(file, flags[, mode])
打開一個文件,並且設置需要的打開選項,mode參數是可選的 |
| 39 |
os.openpty()
打開一個新的偽終端對。返回 pty 和 tty的文件描述符。 |
| 40 |
os.pathconf(path, name)
返回相關文件的系統配置信息。 |
| 41 |
os.pipe()
創建一個管道. 返回一對文件描述符(r, w) 分別為讀和寫 |
| 42 |
os.popen(command[, mode[, bufsize]])
從一個 command 打開一個管道 |
| 43 |
os.read(fd, n)
從文件描述符 fd 中讀取最多 n 個位元組,返回包含讀取位元組的字元串,文件描述符 fd對應文件已達到結尾, 返回一個空字元串。 |
| 44 |
os.readlink(path)
返回軟鏈接所指向的文件 |
| 45 |
os.remove(path)
刪除路徑為path的文件。如果path 是一個文件夾,將拋出OSError; 查看下面的rmdir()刪除一個 directory。 |
| 46 |
os.removedirs(path)
遞歸刪除目錄。 |
| 47 |
os.rename(src, dst)
重命名文件或目錄,從 src 到 dst |
| 48 |
os.renames(old, new)
遞歸地對目錄進行更名,也可以對文件進行更名。 |
| 49 |
os.rmdir(path)
刪除path指定的空目錄,如果目錄非空,則拋出一個OSError異常。 |
| 50 |
os.stat(path)
獲取path指定的路徑的信息,功能等同於C API中的stat()系統調用。 |
| 51 |
os.stat_float_times([newvalue])
決定stat_result是否以float對象顯示時間戳
|
| 52 |
os.statvfs(path)
獲取指定路徑的文件系統統計信息 |
| 53 |
os.symlink(src, dst)
創建一個軟鏈接 |
| 54 |
os.tcgetpgrp(fd)
返回與終端fd(一個由os.open()返回的打開的文件描述符)關聯的進程組 |
| 55 |
os.tcsetpgrp(fd, pg)
設置與終端fd(一個由os.open()返回的打開的文件描述符)關聯的進程組為pg。 |
| 56 |
os.tempnam([dir[, prefix]])
返回唯一的路徑名用於創建臨時文件。 |
| 57 |
os.tmpfile()
返回一個打開的模式為(w+b)的文件對象 .這文件對象沒有文件夾入口,沒有文件描述符,將會自動刪除。 |
| 58 |
os.tmpnam()
為創建一個臨時文件返回一個唯一的路徑 |
| 59 |
os.ttyname(fd)
返回一個字元串,它表示與文件描述符fd 關聯的終端設備。如果fd 沒有與終端設備關聯,則引發一個異常。 |
| 60 |
os.unlink(path)
刪除文件路徑 |
| 61 |
os.utime(path, times)
返回指定的path文件的訪問和修改的時間。 |
| 62 |
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
輸出在文件夾中的文件名通過在樹中遊走,向上或者向下。 |
| 63 |
os.write(fd, str)
寫入字元串到文件描述符 fd中. 返回實際寫入的字元串長度 |
④ MAC python環境變數問題
MAC升級到Big Sur新版本後,python 導入耐搏包時報錯,明明這個包已經安裝過了。
最開始以為是升級後因為許可權什麼的導致python環境出了問題,於是花了時間重裝了anaconda,結果重裝完還是一樣有問題......
更新了flask版本,也在環境變數~/.zshrc和~/.bash_profile裡面添加了anaconda安裝路徑,還是有問題
又折騰了好久,才發現是python模塊搜索路徑有問題,列印出來發現根本沒有包含python的安裝路徑
於是在~/.zshrc裡面添加了PYTHONPATH,可以啦!!!
額,然後發現只是念攜在默認python環境下才可以昌高祥.......一旦進入虛擬環境,又出現同樣的問題,已經安裝的包無法導入。趕時間,只能先臨時修改環境變數(即一旦重啟終端就會失效,需要重新設置),後續有機會再看看怎麼修改到配置文件裡面。
⑤ python sys.path 從哪裡
將路徑「永久"添加到sys.path?
sys.path是python的搜索模塊的路徑集,是一個list
復制代碼 代碼如下:
['', 'C:\\WINDOWS\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26\ \lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python26 ', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32' , 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-packa ges\\Pythonwin']
可以在python 環境下使用sys.path.append(path)添加相關的路徑,但在退出python環境後自己添加的路徑就會自動消失!
在python腳本中修改
復制代碼 代碼如下:
import sys
sys.path.append('c:\\mypythonlib')
為解決這個問題,可以有以下方法:
1. 將自己做的py文件放到 site_packages 目錄下:
下面命令顯示了 site-packages 目錄:
復制代碼 代碼如下:
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib() "
但是這樣做會導致一個問題,即各類模塊都放到此文件夾的話,會導致亂的問題,這一點是顯而易見的。
注意,也不創建子文件夾,再將自己的模塊放到子文件夾解決問題,這會導致使用import 語句時錯誤。
2. 使用pth文件,在 site-packages 文件中創建 .pth文件,將模塊的路徑寫進去,一行一個路徑,以下是一個示例,pth文件也可以使用注釋:
# .pth file for the my project(這行是注釋)
E:\DjangoWord
E:\DjangoWord\mysite
E:\DjangoWord\mysite\polls
這個不失為一個好的方法,但存在管理上的問題,而且不能在不同的python版本中共享。
3. 使用PYTHONPATH環境變數,在這個環境變數中輸入相關的路徑,不同的路徑之間用逗號(英文的!)分開,如果PYTHONPATH 變數還不存在,可以創建它!
路徑會自動加入到sys.path中,而且可以在不同的python版本中共享,應該是一樣較為方便的方法。
⑥ python獲取當前路徑
來自: https://www.cnblogs.com/wind-wang/p/5822192.html
import os,sys
使用sys.path[0]、sys.argv[0]、os.getcwd()、os.path.abspath( file )、os.path.realpath( file )
sys.path是Python會去尋找模塊的搜索路徑列表,sys.path[0]和sys.argv[0]是一回事因為Python會自動把sys.argv[0]加入sys.path。
如果你在C: est目錄下執行python getpathgetpath.py,那麼os.getcwd()會輸出「C: est」,sys.path[0]會輸出「C: estgetpath」。
如果你用py2exe模塊把Python腳本編譯為可執行文件,那麼sys.path[0]的輸出還會變化:
如果把依賴庫用默認的方式打包為zip文件,那麼sys.path[0]會輸出「C: estgetpathlibarary.zip」;
如果在setup.py裡面指定zipfile=None參數,依賴庫就會被打包到exe文件裡面,那麼sys.path[0]會輸出「C: estgetpathgetpath.exe」。
os.getcwd() 「D:」,取的是起始執行目錄
sys.path[0]或sys.argv[0] 「D:python_test」,取的是被初始執行的腳本的所在目錄
os.path.split(os.path.realpath( file ))[0] 「D:python_test」,取的是 file 所在文件test_path.py的所在目錄
正確獲取當前的路徑:
⑦ python import 路徑問題 新手
以下為純手打,下面給幾個demos:
說明:
moles所在的目錄在python里叫package, 下面是一個名為 IsDir的package(實際上就是一個目錄), package下面有4個moles(A, B, C, D)和一個__init__.py文件,目錄結構如下:
IsDir/
A.pyB.pyC.pyD.py__init__.py
大體來講,有兩種方法可以調用某目錄下(包括遞歸目錄)的moles.
一. __init__.py為空時
1.1以下為調用moleA的代碼:
#!/usr/bin/envpython
fromIsDirimportA
A.say()
輸出:
ThisismoleA!
1.2 如果想調用moleA,B,C,D呢?
方法1.
#!/usr/bin/envpython
fromIsDirimportA
fromIsDirimportB
fromIsDirimportC
fromIsDirimportD
A.say()
B.say()
C.say()
D.say()
方法2.
#!/usr/bin/envpython
importIsDir.A
importIsDir.B
importIsDir.C
importIsDir.D
fromIsDirimport*
A.say()
B.say()
C.say()
D.say()
錯誤示例1:
#!/usr/bin/envpython
importIsDir.A
A.say()
錯誤示例2:
#!/usr/bin/envpython
fromIsDirimport*
A.say()
錯誤的原因:
IsDir/目錄下__init__.py為空時,直接importIsDir.A或者fromIsDirimport*是無效的.
從官方文檔里可以看到,__init__.py 里沒有__all__=[mole1,mole2,...]時,
fromIsDirimport* 只能保證IsDir被imported, 所以此時IsDir里的moles是無法被imported,
此時只有如我上面所寫的代碼所示才能正確執行,否則是錯誤的。官方解釋為:importIsDir.A並無任何意義,只有接著執行fromIsDirimport*後,importIsDir.A語句里的moleA才會被定義,所以完整的調用因改為: 1. import IsDir.A 2. from IsDir import *。
二. __init__.py用all=[...]指定該package下可以被imported進去的mole
__init__.py里寫入如下內容:
%catIsDir/__init__.py
__all__=["A","B"]
然後使用之:
#!/usr/bin/envpython
fromIsDirimport*
A.say()
B.say()
結果:
%pythontest.py
ThisismoleA!
ThisismoleB!
錯誤實例:
#!/usr/bin/envpython
fromIsDirimport*
C.say()
以上示例之所以錯誤,是因為C並沒有在__all__=["A","B"]里制定,由此可見,packageIsDir下面的__init__.py里,__all__=[...]具有隔離moles的作用。
補充:
mole A, B, C,D里我分別只定義了一個method, 例如,以下為mole A的code:
%catIsDir/A.py
defsay():
print"ThisismoleA!"
後記:
謝謝這位同學,回答你的問題感覺很有收獲,順便又把python溫習了一遍。回頭把這些總結貼到我的blog上以上為手寫,望採納,共勉。
=============================================================
老子寫了這么多居然採用了另一個簡陋的答案,mlgb的,枉我熬夜給你答題。這種白痴樓主就不配在這里問問題。
⑧ 添加python的import搜索目錄
如果我們要添加自己的搜索目錄,有兩種方法:
一是直接修改sys.path,添加要搜索的目錄:
第二種方法是設置環境變數PYTHONPATH,該環境變數的內容會被自動添加到模塊猜叢搜索路徑中。設置方式與設置唯鋒Path環境變數類似。注意只需要添穗山櫻加你自己的搜索路徑,Python自己本身的搜索路徑不受影響。
⑨ python 模塊的路徑搜索方法
導入一個叫 spam 的模塊時,解釋器先在當前目錄中搜索名為 spam.py 的文件。如果沒有找到的話,接著會到 sys.path 變數中給出的目錄列表中查找。 sys.path 變數的初始值來自如下:
輸入腳本的目錄(當前目錄)。
環境變數 PYTHONPATH 表示的目錄列表中搜索
(這和 shell 變數 PATH 具有一樣的語法,即一系列目錄名的列表)。
Python 默認安裝路徑中搜索。
Note
在支持符號鏈接的文件系統中,輸入的腳本所在的目錄是符號鏈接指向的目錄。 換句話說也就是包含符號鏈接的目錄不會被加到目錄搜索路徑中。
實際上,解釋器由 sys.path 變數指定的路徑目錄搜索模塊,該變數初始化時默認包含了輸入腳本(或者當前目錄), PYTHONPATH 和安裝目錄。這樣就允許 Python 程序了解如何修改或替換模塊搜索目錄。需要注意的是由於這些目錄中包含有搜索路徑中運行的腳本,所以這些腳本不應該和標准模塊重名,否則在導入模塊時 Python 會嘗試把這些腳本當作模塊來載入。這通常會引發錯誤。