请假设以下项目结构:
write
我想从模块fileHash.py中访问模块fileChecker.py。 这是一种全球性的包装。
一种方法是将路径附加到sys.path。 [顺便提一下这个PYTHONPATH吗?]
分发项目时会有什么解决方案?
我怎样才能以一种干净利落的方式实现它?
非常感谢。
更新
另见下面的答案 - >当直接从其包目录中调用fileHash.py(包括从文件导入fileChecker导入)时,需要将项目的路径添加到sys.path(,如下所述)。
测试用例位于/ test(参见上面的结构)中,当从/ test中调用时,还需要添加到sys.path的路径。
答案 0 :(得分:2)
谢谢mguijarr。
我在stackoverflow上找到了一个解决方案: 资源: How to fix "Attempted relative import in non-package" even with __init__.py
当我在项目文件夹/项目中时,我可以像这样调用模块:
python -m packages.files.fileHash (no .py here, because it is a package)
这很好。 在这种情况下,PYTHONPATH是已知的,导入可以如下所示:
from packages.files import fileChecker
如果没有直接调用,而是从我的case / packages / hasher中的包目录中调用 - >需要设置PYTHONPATH:
if __package__ is None:
import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
from packages.files import fileChecker
else:
from packages.files import fileChecker
对我来说重要的是,要包含的路径是PROJECT路径。
上面的代码片段(最后一个)已经包含了描述这两种情况的案例(称为包和直接)。
非常感谢你的帮助。
<强>更新强>:
Python在执行
时会自动添加PYTHONPATH的当前路径python fileHash.py
除了上面的选项之外,另一个选项是在运行这样的程序时设置PYTHONPATH
PYTHONPATH=/path/to/project python fileHash.py
我获得了一些经验,我想分享一下:
尽管如此,在我看来,这在某种程度上并不是一件容易的事情,我发现自己经常反映PYTHONPATH:)
答案 1 :(得分:0)
我终于找到了另一种解决方案,非常直观,无需系统路径或任何其他工具:https://www.tutorialsteacher.com/python/python-package
然后执行他们在“全局安装软件包”中的解释。
以您的情况为例,将“ setup.py”文件放在packages目录中,然后添加两个软件包:
from setuptools import setup
setup(name='mypackage',
version='0.1',
description='Testing installation of Package',
url='#',
author='malhar',
author_email='mlathkar@gmail.com',
license='MIT',
packages=['files', 'hasher'], ## here the names
zip_safe=False)