61273


ディレクトリは以下のように構成されています。

[code]

    .
    ├── mod_a
    │   └── main.py
    └── mod_b
        ├── __init__.py
        └── cls_b.py
    
[/code]

また各ファイルの中身は以下のようになっています。

main.py

[code]

    import sys
    sys.path.append('../')
    
    from mod_b import ClsB
    
    print(ClsB.hello())
    
[/code]

mod_b/__init__.py

[code]

    from .cls_b import ClsB
    
[/code]

mod_b/cls_b.py

[code]

    class ClsB:
        @staticmethod
        def hello():
            return 'Hello Cls B'
    
[/code]

この状態でmain.pyを実行すると、mod_bが見つからないという旨のエラーが発生します。

[code]

    > py mod_a/main.py 
    Traceback (most recent call last):
      File "mod_a/main.py", line 4, in <module>
        from mod_b import ClsB
    ModuleNotFoundError: No module named 'mod_b'
    Error in sys.excepthook:
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
        from apport.fileutils import likely_packaged, get_recent_crashes
      File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
        from apport.report import Report
      File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
        import apport.fileutils
      File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
        from apport.packaging_impl import impl as packaging
      File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 24, in <module>
        import apt
      File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
        import apt_pkg
    ModuleNotFoundError: No module named 'apt_pkg'
    
    Original exception was:
    Traceback (most recent call last):
      File "mod_a/main.py", line 4, in <module>
        from mod_b import ClsB
    ModuleNotFoundError: No module named 'mod_b'
    
[/code]

`sys.path.append('../')`によってmod_bはimportの検索対象に入っていると思うのですが、なぜうまくimport出来ていないのかが分かりません。

main.pyからmod_bパッケージを読み込む方法を教えて下さい。


CC BY-SA 4.0
2019-12-09T12:42:38.097
61272
2019-12-09T13:21:47.350
9616
question
python
親ディレクトリに存在するパッケージのimportに失敗する


`> py
mod_a/main.py`ということで、起動時のディレクトリが、まさにその親ディレクトリだから、それを起点にさらに親ディレクトリに探しに行っているようです。

以下のどれかのパターンで出来るでしょう。  
もっと良いやり方はあるでしょうが、それは他の人に。

  * `mod_a`ディレクトリに降りて`py main.py`と実行する
  * `sys.path.append('../')`を`sys.path.append('./')`に変更する
  * `import os`して、`sys.path.append('../')`を`sys.path.append(os.path.dirname(__file__) + '/../')`に変更する
  * `import os`して、`sys.path.append('../')`の前に`os.chdir(os.path.dirname(__file__))`を記述する

参考：  
[Pythonで実行中のファイルの場所（パス）を取得する__file__](https://note.nkmk.me/python-script-file-
path/)


CC BY-SA 4.0
2019-12-09T13:11:46.707
61273
2019-12-09T13:21:47.350
2019-12-09T13:21:47.350
26370
26370
61272
answer