Python ModuleNotFoundError 'smored', хотя папка smored имеет __init__.py - PullRequest
0 голосов
/ 24 июня 2018

У меня есть приложение на Python, которое разработала команда, и если я запускаю «docker-compose up», а затем запускаю модульные тесты, они отлично работают. Так что эта часть потрясающая.

Но я отвечаю за то, чтобы наше приложение было построено, а образ Docker создан в Jenkins. А в Jenkins я использую команду «docker build», а затем команду «docker run» и устанавливаю CMD для нашего сценария «runtests.py». Очевидно, нам нужно автоматически запускать тесты в Jenkins. И когда я делаю это, я получаю эту ошибку:

ModuleNotFoundError: No module named 'smored'

Итак, я добавил отладочную информацию в наш скрипт runtests.py:

print(" os.path.dirname(os.path.realpath(__file__)) " + os.path.dirname(os.path.realpath(__file__))) 
print(" os.getcwd() " + os.getcwd()) 

try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
    print(" PYTHONPATH " + user_paths)
except KeyError:
    print(" There was a KeyError when we tried os.environ['PYTHONPATH'].split(os.pathsep) ")

list_dir = os.listdir(".") # returns list
print("contents of cwd directory")
for item in list_dir:
    print(item)

try:
    list_dir = os.listdir("smored") # returns list
    print("contents of smored directory")
    for item in list_dir:
        print(item)
except:
    print("In the current working directory, we could not find a path called 'smored'")

И похоже, что скрипт выполняется в правильном каталоге, и в этом каталоге есть папка с именем «smored», внутри которой находится пустой файл с именем init .py. Поэтому должен быть модуль с именем «smored», и эта ошибка не должна возникать.

Следующие 2 строки в runtests.py:

os.environ['DJANGO_SETTINGS_MODULE'] = 'smored.settings.test'
django.setup()

Сценарий умирает на следующей строке, когда мы вызываем django.setup.

Почему этот код выдает эту ошибку:

ModuleNotFoundError: No module named 'smored'

1 Ответ

0 голосов
/ 24 июня 2018

Эта строка:

print(" os.getcwd() " + os.getcwd()) 

показал, что когда Docker работал, CWD был /app.

Я добавил папку settings в sys.path:

sys.path.append("/app/")
sys.path.append("/app/smored/")
sys.path.append("/app/smored/settings/")

Тогда я смог упростить DJANGO_SETTINGS_MODULE:

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.test'
django.setup()

И тогда все наконец заработало.

Надеюсь, это спасет кого-то от головной боли, от которой я был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...