简体   繁体   中英

Python ModuleNotFoundError for my main package

This is a follow up question for a question I asked not long ago . The answer is correct and works great, but when I tried to apply it to the main package it didn't work.

Lets say I have the following files structure:

a/
->b/
  ->c/
    -> __init__.py
    -> script1.py
    -> script2.py
  ->d/
    -> __init__.py
    -> script3.py

(The __init__ files are just like in the answer I linked above).

And in script3.py I import script1.py like so: from bc import script1 .

It works when I run it in Pycharm, but when I clone the repository in Colab (all this code is in a GitHub repository) I get the error: ModuleNotFoundError: No module named 'b'

Which makes sense because my package is not in the sys.path variable. And adding the folder a to the sys.path manually, after I cloned the repository, helps but it is not a real solution because I can't always do it (eg in unit-tests).

So my question is, how can I fix it¿ Adding the __init__ file to folder b didn't help.

Notes:

  1. Folder a is the project's folder, so it is not part of the path.
  2. My GitHub repository is private, so I am not sure if making it installable (by adding setup.py and all that) would be helpful, but its my first time so I am not sure.
  3. In Colab I import script3 like so from abd import script3 . In this case I must specify folder a because, again, b is not in sys.path .
  4. As I mentioned above, I can manually fix it in Colab but it doesn't really solves the issue, because if I want to run unit-tests for example it won't work.

You can backwardly add folder b to your path and then import only from c folder, like this:

from os.path import realpath, dirname
import sys

sys.path.append(dirname(dirname(realpath(__file__))))

from c import script1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM