Python工程目錄結(jié)構(gòu),目錄之間自定義包模塊文件的引用

摘要:PythonPycharm

工程結(jié)構(gòu)

一個通用的Python工程目錄結(jié)構(gòu)如下

MY_PROJECT
├── bin
│   ├── run_inc.sh
│   └── run_stored.sh
├── docs
│   └── config.yml
├── logs
│   └── detail.log
├── my_project
│   ├── data
│   │   └── dictionary.txt
│   ├── inc_main.py
│   ├── main
│   │   ├── __init__.py
│   │   ├── predict.py
│   │   ├── preprocessing.py
│   │   ├── rank.py
│   │   └── recall.py
│   ├── stored_main.py
│   └── utils
│       ├── config.py
│       ├── __init__.py
│       ├── md5_utils.py
│       └── mysql_utils.py
├── README.md
└── requirements.txt

項目名:根目錄MY_PROJECT下創(chuàng)建項目目錄my_project拦惋,不要把項目代碼直接暴露在根目錄下,項目目錄下包含源代碼中的所有模塊安寺、包厕妖,程序入口以main.py命名暴露在項目目錄下,例子中是inc_main和stored_main增存量程序入口
bin: 存放項目的一些可執(zhí)行文件
docs: 存放一些文檔我衬,配置文件在該目錄下
logs:存儲日志文件
requirements.txt: 存放軟件依賴的外部Python包列表
README.md: 項目說明文件


__init__.py的作用

有__init__.py的目錄是Python包,目錄下的Python腳本叫做模塊饰恕,沒有的只是普通目錄挠羔,一般__init__.py都為空,當(dāng)導(dǎo)入帶有__init__.py的包時都會先去執(zhí)行__init__.py腳本埋嵌,因此可以在__init__.py做相應(yīng)的初始化
破加。


同目錄下引入包和模塊

同一目錄下模塊互相引用.png

此時需要在rank模塊里面引用recall的方法,直接以模塊名稱開頭進行引用即可
同一目錄下模塊互相引用2.png

此時可以正常運行雹嗦,但是模塊爆紅范舀,在嘗試一下Python console控制臺運行合是,報錯找不到模塊
同一目錄下模塊互相引用3.png

解決方案是在Pycharm的Settings中增加Python console的設(shè)置,增加source目錄加入到尋找包的搜索列表中
Pycharm中console增加了包搜索路徑.png

并且在項目結(jié)構(gòu)中指定source目錄如下
增加source目錄.png

添加之后main目錄變?yōu)樗{(lán)色锭环,并且代碼在Python console可以運行聪全,而且紅線消失


跨目錄引用自定義包

在某個Python腳本中只能引用和該腳本同一目錄級別下的Python模塊,引入非同級下的文件直接報錯找不到模塊辅辩,需要使用sys.path.append方法添加路徑到包搜索路徑难礼,比如在main下的模塊需要引用utils下的模塊方法

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from utils.config import get_string

print(get_string("a"))

當(dāng)在linux機器運行的時候采用絕對路徑,如果是相對路徑os.path.dirname(__file__)返回為空字符串

root@ubuntu:~/../MY_PROJECT/my_project# python /home/.../MY_PROJECT/my_project/main/rank.py
1

如果是相對路徑還是報錯

root@ubuntu:~/.../MY_PROJECT/my_project/main# python rank.py
Traceback (most recent call last):
  File "rank.py", line 6, in <module>
    from utils.config import get_string
ModuleNotFoundError: No module named 'utils'

但是在Pycharm中可以正常運行玫锋,因此最好在Python腳本中對__file__使用絕對路徑os.path.abspath

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from utils.config import get_string

print(get_string("a"))

讀取自定義文件

sys.path是自動搜索Python包模塊的路徑蛾茉,對于其他文件需要手動修改路徑,使得路徑相對于當(dāng)下模塊的路徑正確撩鹿,否則找不到文件

跨目錄讀取文件.png

utils包下config.py模塊讀取根目錄下docs目錄下的yaml配置文件的代碼實例如下谦炬,使用os.path.join拼接目錄得到絕對路徑

import os
import yaml

BASIC_PATH = (os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
YAML_FILE = os.path.join(BASIC_PATH, "./docs/config.yml")


def load_yaml_config(yaml_file):
    with open(yaml_file) as f:
        config = yaml.load(f, Loader=yaml.FullLoader)
    return config


conf = load_yaml_config(YAML_FILE)


def get_string(key: str, default: str = None):
    if key in conf.keys():
        return str(conf.get(key))
    return default


if __name__ == '__main__':
    res = get_string("a")
    print(res)

自動輸出requirements.txt

下載第三方依賴包pipreqs

pip install pipreqs

打開Pycharm的終端,在項目的根目錄下輸入如下命令

(base) root@ubuntu:~/.../MY_PROJECT# pipreqs . --force
INFO: Successfully saved requirements file in ./requirements.txt
PyYAML==5.4.1
scikit_learn==0.24.1

使用發(fā)現(xiàn)導(dǎo)出的包和實際開發(fā)環(huán)境中的包版本不一致节沦,還得謹(jǐn)慎使用


可執(zhí)行文件.sh

在bin下指定了兩個可執(zhí)行文件键思,分別對應(yīng)項目目錄下的增量和存量main腳本,內(nèi)容如下

#!/bin/bash
cd ../my_project
python3 inc_main.py
root@ubuntu:~/.../MY_PROJECT/bin# chmod +x run_inc.sh 
root@ubuntu:~/.../MY_PROJECT/bin# bash run_inc.sh 
1
finished!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末散劫,一起剝皮案震驚了整個濱河市稚机,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌获搏,老刑警劉巖赖条,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異常熙,居然都是意外死亡纬乍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門裸卫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仿贬,“玉大人,你說我怎么就攤上這事墓贿〖肜幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵聋袋,是天一觀的道長队伟。 經(jīng)常有香客問我,道長幽勒,這世上最難降的妖魔是什么嗜侮? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上锈颗,老公的妹妹穿的比我還像新娘顷霹。我一直安慰自己,他們只是感情好击吱,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布淋淀。 她就那樣靜靜地躺著,像睡著了一般姨拥。 火紅的嫁衣襯著肌膚如雪绅喉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天叫乌,我揣著相機與錄音柴罐,去河邊找鬼。 笑死憨奸,一個胖子當(dāng)著我的面吹牛革屠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播排宰,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼似芝,長吁一口氣:“原來是場噩夢啊……” “哼涛菠!你這毒婦竟也來了畅买?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤姊舵,失蹤者是張志新(化名)和其女友劉穎盐类,沒想到半個月后寞奸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡在跳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年枪萄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猫妙。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓷翻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出割坠,到底是詐尸還是另有隱情齐帚,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布彼哼,位于F島的核電站对妄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沪羔。R本人自食惡果不足惜饥伊,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔫饰。 院中可真熱鬧琅豆,春花似錦、人聲如沸篓吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖剪。三九已至冻押,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盛嘿,已是汗流浹背洛巢。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留次兆,地道東北人稿茉。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像芥炭,于是被迫代替她去往敵國和親漓库。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容