看板 Python 關於我們 聯絡資訊
抱歉,我一開始舉的例子似乎過於簡化且容易引起困惑, 我試著把狀況寫得更詳盡一點,但可能會稍長,請大家見諒。 先回覆ThxThx的問題:
ThxThx: 我蠻好奇,有什麼理由要把script和package放在一起嗎 06/18 19:46
ThxThx: 就連手動加進sys.path也是不好的手段 06/18 19:46
就一般來說,我還真不瞭解Python的import邏輯是什麼... 假如我有一個自己寫的package foo,裡面有個common.py, 另外有個專門放分析ipynb的資料夾bar,bar跟foo在同一層。 每次我都要先在分析的開頭寫sys.path.append(".."), 才能from foo.common import *。 我也覺得這樣寫好像很醜, 但是我又不能直接寫成from ..foo.common import *, (ValueError: attempted relative import beyond top-level package) 我不懂為什麼會這樣,明明才往上一層,怎麼就beyond top-level了。 希望有人可以順便為我解惑。 -------- 回到我本次的project,我的資料夾最初大概長這樣: X_project |--ocr_tools.py |--recognize.py(請見本板#1R9exc1U) |--requirements.txt |--test_list.json |--photos |--(很多張測試用照片) |--X_manuals |--(很多csv、json等格式的資料檔案) |--functionality_check |--validate.py |--validation_log.txt 其中, 綠色的部分是想轉成CLI功能的(這裡看到的都只是scripts), recognize.py包含主要的功能,validate.py是給開發者跑自我診斷用的。 BTW,這是一個內部的套件,所以沒有要上到PyPI。 粉紅色是運行依賴的資料(亮色是需要讀、深色是需要寫)。 現在,假設我在X_project資料夾下, 我可以python recognize.py -i <image_file>、 以及python functionality_check/validate.py跑自我診斷。 現在,因為要包成package,所以我把架構做了點調整,變成: X_project |--setup.py |--clsmbstu_ocr |--__init__.py |--ocr_tools.py |--recognize.py |--requirements.txt |--test_list.json |--photos |--(很多張測試用照片) |--X_manuals |--(很多csv、json等格式的資料檔案) |--functionality_check |--__init__.py |--validate.py |--validation_log.txt 另外,把recognize.py與validate.py可運行的部份改成一個main_func。 所以我的setup.py是這樣寫的: ``` import re from setuptools import setup, find_packages with open("clsmbstu_ocr/requirements.txt") as req: dependencies = [re.match(r"(.+)\n", line).group(1) for line in req] setup( name="clsmbstu_ocr", version="1.0.0-1", packages=find_packages(), install_requires=dependencies, package_data={ "": ["*.json", "*.jpg", "*.png", "*.txt"] }, entry_points={ "console_scripts": [ "ocr_view = clsmbstu_ocr.recognize:main_func", "ocr_validate = clsmbstu_ocr.functionality_check.validate:main_func" ] }, author="clsmbstu", author_email="XXX@mail", description="blablabla" ) ``` 然後運行python setup.py install,看起來安裝可以跑完, 但是一運行ocr_view馬上就遇到第一個錯誤: ModuleNotFoundError: No module named 'ocr_tools' 做了很多嘗試, 反正不是ModuleNotFoundError,就是所需資料檔找不到的FileNotFoundError... 現在已經不太知道怎麼辦了。 我不知道這樣提供的資訊夠不夠? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.74.120.191 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1529638467.A.4C2.html ※ 編輯: clsmbstu (203.74.120.191), 06/22/2018 11:36:36
MAGICXX: 呃 為什麼要from XX import *呢? 06/22 11:56
MAGICXX: 直接import XX不就好了? 06/22 11:56
MAGICXX: 你的情況就是 import foo.common 就好了不是? 06/22 11:57
clsmbstu: 你是說我第一頁的例子嗎? 06/22 12:31
clsmbstu: import foo.common的話,呼叫裡面的函數不方便 06/22 12:32
clsmbstu: 例如我得要:foo.common.do_a_thing() 06/22 12:33
clsmbstu: 但是 from foo.common import * 的話 06/22 12:34
clsmbstu: 要做某個分析或常用轉換我只要:do_a_thing() 就可以了 06/22 12:34
clsmbstu: 的確你說的方式也可以 但我相信跟我最大的問題無關 06/22 12:37
clsmbstu: 因為事實上我也不能 import ..foo.common 06/22 12:39
clsmbstu: SyntaxError: invalid syntax 06/22 12:39
ThxThx: 我開一篇回你 06/22 16:02