从另一个子包导入子包的模块项

时间:2015-09-25 15:46:24

标签: python packages

我有这个项目结构:

root_package/
root_package/packA/
root_package/packA/__init__.py (empty)
root_package/packA/moduleA.py
root_package/packB/__init__.py (empty)
root_package/packB/moduleB.py
root_package/rootModule.py

rootModule.pyfrom packA.moduleA import ModuleAClasspackA.moduleA.py,我有from root_package.packB.moduleB import ModuleBItem

当通过PyCharm或带有python ./rootModule.py的终端运行rootModule时,我收到此错误:

这是正确的导入方式吗?

Traceback (most recent call last):
  File "/project_dir/rootPackage/rootModule.py", line 7, in <module>
    from packA.moduleA import ModuleAClass
  File "/project_dir/rootPackage/packA/moduleA.py", line 8, in <module>
    from rootPackage.packB.moduleB import module_b_method
  File "/project_dir/rootPackage/rootModule.py", line 7, in <module>
    from packA.wavelet_compression import WaveletCompression
ImportError: cannot import name WaveletCompression

如何解决这个问题?

更新1
我已在 project_folder root_package文件夹)中添加了测试文件。
所以当前的目录结构如下:

project_folder/
project_folder/root_package/
project_folder/root_package/packA/
project_folder/root_package/packA/__init__.py (empty)
project_folder/root_package/packA/moduleA.py
project_folder/root_package/packB/__init__.py (empty)
project_folder/root_package/packB/moduleB.py
project_folder/root_package/rootModule.py
project_folder/test_rootModule.py

我还没有制作project_folder一个包(没有__init__.py文件),因为test_rootModule只是一个帮我运行实验的脚本。

因此,在root_package/packA/moduleA.py中,在将from root_package.packB.moduleB import ModuleBitem更改为from packB.moduleB import ModuleBitem之后,如答案所示,它可以正常运行。

但现在有两个问题:
1. PyCharm不同意这一变化:
pycharm-import-error

  1. 我无法从project_folder/test_rootModule.py脚本运行我的实验。 我收到了这个错误:

    追踪(最近的呼叫最后):
      文件&#34; project_folder / test_rootModule.py&#34;,第8行,在中     从root_package.rootModule导入rootModuleClass
      文件&#34; project_folder / root_package / rootModule.py&#34;,第7行,在中     来自packA.moduleA导入ModuleAClass
      文件&#34; project_folder / root_package / packA / moduleA.py&#34;,第8行,在中     来自packB.moduleB import module_b_item
    ImportError:没有名为packB.moduleB的模块

  2. 我似乎无法让第二个回溯看起来像代码段。

    更新2

    解决问题的原因是PyCharm中的Project: project_name > Project Structure对话框,选择root_package然后将其设置为Sources文件夹。
    现在,我可以通过IDE运行rootModuletest_rootModule

    虽然,但我无法从终端运行test_rootModuletest_rootModule有这些导入:

    from root_package.rootModule import RootModuleClass
    from root_package.packB.moduleB import module_b_item
    

    我在project_folder目录,并运行python ./test_rootModule.py并收到此错误:

    Traceback (most recent call last):
      File "./test_rootModule.py", line 8, in <module>
        from root_package.rootModule import RootModuleClass
      File "project_folder/root_package/rootModule.py", line 7, in <module>
        from packA.moduleA import ModuleAClass
      File "project_folder/root_package/packA/moduleA.py", line 8, in <module>
        from packB.moduleB import module_b_item
    ImportError: No module named packB.moduleB
    

1 个答案:

答案 0 :(得分:1)

如果您在此路径中运行所有代码:

project_folder

然后,您应确保首先引用位于root_package的所有模块。例如:

from root_package.modA import foo