作者clsmbstu (missing)
看板Python
标题Re: [问题] 请问为何os.getcwd()不总在sys.path内?
时间Fri Jun 22 11:34:24 2018
抱歉,我一开始举的例子似乎过於简化且容易引起困惑,
我试着把状况写得更详尽一点,但可能会稍长,请大家见谅。
先回覆ThxThx的问题:
1F:→ ThxThx: 我蛮好奇,有什麽理由要把script和package放在一起吗 06/18 19:46
2F:→ 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://webptt.com/cn.aspx?n=bbs/Python/M.1529638467.A.4C2.html
※ 编辑: clsmbstu (203.74.120.191), 06/22/2018 11:36:36
3F:推 MAGICXX: 呃 为什麽要from XX import *呢? 06/22 11:56
4F:→ MAGICXX: 直接import XX不就好了? 06/22 11:56
5F:→ MAGICXX: 你的情况就是 import foo.common 就好了不是? 06/22 11:57
6F:→ clsmbstu: 你是说我第一页的例子吗? 06/22 12:31
7F:→ clsmbstu: import foo.common的话,呼叫里面的函数不方便 06/22 12:32
8F:→ clsmbstu: 例如我得要:foo.common.do_a_thing() 06/22 12:33
9F:→ clsmbstu: 但是 from foo.common import * 的话 06/22 12:34
10F:→ clsmbstu: 要做某个分析或常用转换我只要:do_a_thing() 就可以了 06/22 12:34
11F:→ clsmbstu: 的确你说的方式也可以 但我相信跟我最大的问题无关 06/22 12:37
12F:→ clsmbstu: 因为事实上我也不能 import ..foo.common 06/22 12:39
13F:→ clsmbstu: SyntaxError: invalid syntax 06/22 12:39
14F:推 ThxThx: 我开一篇回你 06/22 16:02