从python中的另一个包中导入包

时间:2015-11-15 19:14:34

标签: python python-import

请假设以下项目结构:

write

我想从模块fileHash.py中访问模块fileChecker.py。 这是一种全球性的包装。

一种方法是将路径附加到sys.path。 [顺便提一下这个PYTHONPATH吗?]

分发项目时会有什么解决方案?

  • 同上? - >但随后可能会有通往模块的路径 PYTHONPATH中的同名?
  • setuptools是否正在完成所有工作?

我怎样才能以一种干净利落的方式实现它?

非常感谢。

更新

另见下面的答案 - >当直接从其包目录中调用fileHash.py(包括从文件导入fileChecker导入)时,需要将项目的路径添加到sys.path(,如下所述)。

测试用例位于/ test(参见上面的结构)中,当从/ test中调用时,还需要添加到sys.path的路径。

2 个答案:

答案 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路径。

上面的代码片段(最后一个)已经包含了描述这两种情况的案例(称为包和直接)。

非常感谢你的帮助。

<强>更新

  1. 只是为了让我的答案更完整
  2. Python在执行

    时会自动添加PYTHONPATH的当前路径
    python fileHash.py
    

    除了上面的选项之外,另一个选项是在运行这样的程序时设置PYTHONPATH

    PYTHONPATH=/path/to/project python fileHash.py
    
    1. 我获得了一些经验,我想分享一下:

      • 我不再在他们的目录中运行模块了。
      • 启动应用程序,运行测试或sphinx或pylint或从项目目录中完成所有操作。
      • 这可确保项目目录包含在python路径中,并且可以找到所有包,模块而无需在导入上执行其他操作。
      • 我仍然使用sys.path设置项目文件夹的python路径的唯一地方是在我的setup.py中,以便使代码工作。
    2. 尽管如此,在我看来,这在某种程度上并不是一件容易的事情,我发现自己经常反映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)