我是 Python 的新手,我很难理解我尝试做的事情是不可能的,还是我做错了。我承认我来自 Perl - 其中关于放置包的位置以及目录的外观的规则有点宽松,所以我的观点不是那么 pythonic。
此外,这是我问过几次的问题的不同版本 here和 here我不断得到答案(我很感激)说我不应该,但从来没有“这是不可能的”或“尽管你不应该这样做,但你是这样做的”。如果有可能,但不可取,我宁愿能够通过尝试和观察找出原因,如果设计不可能,我想知道(不要再用头撞墙了)。
提前为冗长的介绍道歉 - 最后是问题。
我有这个不错的模块 - svgpathtools - 包含方法、类并位于特定于安装的目录中(在 Blender 附带的 Python 安装中),目录如下所示:
/home/simone/blender/blender-2.92.0-linux64/2.92/python/lib/python3.7/site-packages/svgpathtools
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ ├── bezier.cpython-37.pyc
│ ├── document.cpython-37.pyc
│ ├── misctools.cpython-37.pyc
│ ├── parser.cpython-37.pyc
│ ├── path.cpython-37.pyc
│ ├── paths2svg.cpython-37.pyc
│ ├── polytools.cpython-37.pyc
│ ├── smoothing.cpython-37.pyc
│ ├── svg_io_sax.cpython-37.pyc
│ └── svg_to_paths.cpython-37.pyc
├── bezier.py
├── document.py
├── misctools.py
├── parser.py
├── path.py
├── paths2svg.py
├── polytools.py
├── smoothing.py
├── svg_io_sax.py
└── svg_to_paths.py
1 directory, 22 files
我想向它添加功能而不弄乱那个目录并且没有子类化。第一个原因很明显,第二个原因是因为现在我最多只添加几个方法,所以不值得维护整个子类(至少现在是这样)。所以我的想法是有一个看起来像这样的目录:
/home/simone/blender_learning/mesh-20210920
└── svgpathtools
├── __init__.py
└── distance.py
现在:如果我保留 svgpathtools/__init__.py
,python (3.8.10) 将不会在 Blender 安装子目录中找到原始的 svgpathtools
,所以它的所有功能消失了
如果我删除 svgpathtools/__init__.py
,python 将找不到 svgpathtools/distance.py
,所以 import svgpathtools.distance
会抛出错误。
那是哪一个:
- 这是不可能的:由于 python 查找包的方式,您不能在与主包不同的地方放置子包
- 我在某些方面做错了(请告诉我原因)
拜托了:不要只是告诉我我不应该这样做而不告诉我它是哪一个。我知道可行 <> 可取(玩炸药?抚摸饥饿的豹子?吃河豚?)
最佳答案
导入模块时 import <module>
python 查找第一个匹配项的路径
import sys
print(sys.path)
所以拥有一个同名模块最终会隐藏它,而不是你想要的是继续查找并合并它们。因此,您必须为您的扩展包命名,以免与之冲突。
您可能可以通过使用 importlib
滚动您自己的导入方法来获得您想要的行为和模块周围的包装器以回退到另一个模块,但这似乎不值得。
关于不同子目录中的 Python 包/模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69255839/