Python的路徑引用

2022-09-14 08:45:12 字數 3315 閱讀 8066

from config import swordfishconf

from utils import log

from utils.mysql_base import mysqlbase

將程式的home目錄新增到sys.path中,然後以此為準,進行跳轉。

例子中對於封裝的mysqlbase類訪問是先訪問utils包,然後從mysql_base.py中找到mysqlbase類

缺點:檢視**的時候當前指令碼和包的關係不十分明了,需要調到home,然後再從home進行逐個查詢

問題:如何直接看出當前指令碼和包的關係,而不是經過home

配置pythonpath:

export pythonpath=/data1/guosong/opdir/20141017/test:$pythonpath

**示例:

.

|-- __init__.py

|-- lib

| |-- __init__.py

| |-- pack1

| | |-- __init__.py

| | |-- a.py

| | `-- aa.py

| `-- pack2

| |-- __init__.py

| |-- b.py

|-- test.py

test.py的**如下:

[root@typhoeus79 ice_test_m test]# more test.py

#!/usr/bin/env python2.7

#-*- coding:utf8 -*-

from __future__ import absolute_import

from lib.pack1.a import aobject

if __name__ == '__main__':

aobject.printword()

從lib.pack1.a中引用類aobject,呼叫它的靜態方法

a.py內容:

[root@typhoeus79 ice_test_m pack1]# more a.py

#!/usr/bin/env python2.7

#-* coding:utf8 -*-

from __future__ import absolute_import

#from .a import bobject

from ..pack2.b import bobject

class aobject(object):

@classmethod

def printword(self):

b = bobject('a call b class')

a.py中又呼叫上一次目錄pack2.b中的bobject

b.py內容為:

[root@typhoeus79 ice_test_m pack2]# more b.py

#!/usr/bin/env python2.7

#-* coding:utf8 -*-

#from __future__ import absolute_import

class bobject(object):

def __init__(self,bstr):

print "b:%s" % bstr

好處:不用再經過home,直接根據相對路徑進行跳轉

4.1、valueerror: attempted relative import in non-package

包含相對路徑import 的python指令碼不能直接執行,只能作為module被引用。原因正如手冊中描述的,所謂相對路徑其實就是相對於當前module的路徑,但如果直接執行指令碼,這個module的name就是「__main__」, 而不是module原來的name, 這樣相對路徑也就不是原來的相對路徑了,匯入就會失敗,出現錯誤「valueerror: attempted relative import in non-package」

在使用相對引用的檔案中,不能有__main__方法,只執行作為乙個module進行引用,而不是直接執行指令碼。

4.2、 valueerror: attempted relative import beyond toplevel package

test.py內容:

[root@typhoeus79 ice_test_m test]# more test.py

#!/usr/bin/env python2.7

#-*- coding:utf8 -*-

from __future__ import absolute_import

from pack1.a import aobject

from pack1.a import now

if __name__ == '__main__':

aobject.printword()

print now

其他均不變,但是將pack2和pack1的包遷移到外面出

.

|-- __init__.py

|-- lib

| |-- __init__.py

|-- pack1

| |-- __init__.py

| |-- a.py

| `-- aa.py

|-- pack2

| |-- __init__.py

| |-- b.py

|-- test.py

執行test.py出錯:

[root@typhoeus79 ice_test_m test]# ./test.py 

traceback (most recent call last):

file "./test.py", line 7, in from pack1.a import aobject

file "/data1/guosong/opdir/20141017/test/pack1/a.py", line 6, in from ..pack2.b import bobject

valueerror: attempted relative import beyond toplevel package

處理方式是建立乙個lib目錄,將pack1和pack2拉到lib下面,修改test.py中的路徑然後就ok了。

【參考資料】

1、2、

Python 絕對路徑引用

python開發時經常出現找不到import物件的問題,importerror no module named 一般的原因不外乎 未安裝對應依賴 引用物件的資料夾下缺失 init py檔案 由於通過相對路徑的載入,導致找不到object 針對原因1和2通過安裝依賴和新增 init py檔案即可。原因...

引用的dll路徑問題

在.net專案中我們經常會引用一些dll,但是這些dll會預設在可執行檔案目錄下。如果dll較多,會顯得該目錄很臃腫。如果我們可以另外建乙個目錄專門存放這些dll就比較好。xmlns urn schemas microsoft com asm.v1 yes privatepath common se...

Ext學 引用的ExtJs路徑

如果jsp頁面在webroot下面的乙個資料夾 例如 page 裡並且ext 2.1 下面adapter air build resources source changes.html ext all.js ext core.js 也在webroot下面時,引用的路徑如下 ext 2.1 resou...