Я пытаюсь упаковать свой проект для распространения, но я RuntimeWarning
когда запускаю модуль.
Я нашел отчет об ошибке в списке рассылки Python, который указывает, что RuntimeWarning
является новым поведением, которое было введено в Python 3.5.2.
Прочитав отчет об ошибке, кажется, что происходит двойной импорт, и это RuntimeWarning
правильное в том, что RuntimeWarning
предупреждения пользователя. Однако я не вижу, какие изменения мне необходимо внести в свою структуру проекта, чтобы избежать этой проблемы.
Это первый проект, который я попытался структурировать "правильно". Я хотел бы иметь аккуратный макет, когда я нажимаю код и структуру проекта, которая может быть клонирована и легко запускаться другими.
Я основывал свою структуру главным образом на http://docs.python-guide.org/en/latest/writing/structure/.
Я добавил детали минимального рабочего примера ниже.
Чтобы реплицировать проблему, я запускаю основной файл с помощью python -m
:
(py36) X:\test_proj>python -m proj.proj
C:\Users\Matthew\Anaconda\envs\py36\lib\runpy.py:125: RuntimeWarning:
'proj.proj' found in sys.modules after import of package 'proj', but prior
to execution of 'proj.proj'; this may result in unpredictable behaviour
warn(RuntimeWarning(msg))
This is a test project.'
Выполнение моих тестов в порядке:
(py36) X:\test_proj>python -m unittest tests.test_proj
This is a test project.
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Структура проекта для репликации проблемы выглядит следующим образом:
myproject/
proj/
__init__.py
proj.py
tests/
__init__.py
context.py
test_proj.py
В файле proj/proj.py
:
def main():
print('This is a test project.')
raise ValueError
if __name__ == '__main__':
main()
В proj/__init__.py
:
from .proj import main
В tests/context.py
:
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import proj
Наконец, в tests/test_proj.py
:
import unittest
from .context import proj
class SampleTestCase(unittest.TestCase):
"""Test case for this sample project"""
def test_raise_error(self):
"""Test that we correctly raise an error."""
with self.assertRaises(ValueError):
proj.main()
if __name__ == '__main__':
unittest.main()
Может ли кто-нибудь помочь мне исправить мою структуру проекта, чтобы избежать этого сценария двойного импорта? Любая помощь с этим была бы весьма признательна.