因?yàn)橄雵L試在我們的桌面軟件中加入python支持,所以想簡化python的庫,到時(shí)候直接放到客戶機(jī)上面,并且放到我們的目錄下,盡量免去不必要的東西,也不要影響機(jī)子,不過當(dāng)寫好的程序放到測試機(jī)子上后,老是說找不到no module named site,后來看下了代碼,發(fā)現(xiàn)是找不到site這個(gè)庫,這個(gè)庫也是python初始化的時(shí)候需要用到的庫,解決方法:
1.嘗試把我電腦上的python里面的Lib放到客戶機(jī)上程序的目錄,建立一個(gè)python27/lib/,結(jié)果還是失敗
2.把lib下的東西放到跟exe同一個(gè)目錄,可以,但是還是誰顯示import pbk_resource錯(cuò)誤,但已經(jīng)可以運(yùn)行python的解釋器了,不過因?yàn)楦?span lang="en-US">exe在同一個(gè)目錄太雜,所以放棄這種方法
后來看了Py_Initialize的代碼,發(fā)現(xiàn)在沒有設(shè)置PYTHONHOME的時(shí)候,python是這樣查找lib的:
如下代碼
if (pythonhome == NULL || *pythonhome == '/0') { if (search_for_PRefix(argv0_path, LANDMARK)) pythonhome = prefix; else pythonhome = NULL; } else strncpy(prefix, pythonhome, MAXPATHLEN);
1.這個(gè)是當(dāng)pythonhome為NULL的時(shí)候,python的初始化函數(shù)會(huì)調(diào)用search_for_prefix來設(shè)置默認(rèn)的home
static intsearch_for_prefix(char *argv0_path, char *landmark){ /* Search from argv0_path, until landmark is found */ strcpy(prefix, argv0_path); do { if (gotlandmark(lan dmark)) return 1; reduce(prefix); } while (prefix[0]); return 0;}
2.landmark是一個(gè)字符串,里面是lib/os.py,gotlandmark主要是測試下當(dāng)年目錄下的是否有lib/os.py
/* gotlandmark only called by search_for_prefix, which ensures 'prefix' is null terminated in bounds. join() ensures 'landmark' can not overflow prefix if too long.*/static intgotlandmark(char *landmark){ int ok; Py_ssize_t n; n = strlen(prefix); join(prefix, landmark); ok = ismodule(prefix); prefix[n] = '/0'; return ok;}
3.如果沒有,則再往上上找一層目錄,繼續(xù)執(zhí)行2的步驟,直到找到或者prefix[0]為0后才會(huì)停止
那么我們只要把python27下的lib考到客戶機(jī)上的exe目錄下就可以了
把測試程序運(yùn)行一遍以后,正常,接下來就是精簡庫了, 基本上把test和unittest,email之類的庫刪掉就可以了
 
  | 
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注