Есть ли способ заставить PyCharm всегда использовать абсолютный импорт? - PullRequest
0 голосов
/ 23 октября 2018

Я использую PyCharm и часто полагаюсь на сочетание клавиш alt + enter для автоматического импорта классов и функций.

Однако он не использует абсолютный путь импорта.Локально работает, но когда я нажимаю на GitHub, мои тесты не проходят в TravisCI.

Кто-нибудь знает способ заставить PyCharm импортировать по абсолютному пути?

Мне нужно импортировать вот так drone_squadron.api.drone_api, если я использую что-то вроде этого api.drone_api, то удаленные тесты могут 'найти импорт.Это для всего местного импорта.

Я бы предпочел, чтобы весь импорт всегда был абсолютным.Относительный импорт вызвал у меня проблемы с упаковкой проектов.Я думаю, что проще использовать абсолютный импорт все время.

Git Repo

https://github.com/sarcoma/drone_squadron_api_prototype

Древовидная структура

.
├── coverage.xml
├── LICENSE.md
├── pytest.ini
├── README.md
├── requirements.txt
├── drone_squadron
│   ├── app.py
│   ├── endpoints.http
│   ├── flask.cfg
│   ├── __init__.py
│   ├── load_fixtures.py
│   ├── main.py
│   ├── router.py
│   ├── schema.py
│   ├── test_flask.cfg
│   ├── api
│   │   ├── base_api.py
│   │   ├── drone_api.py
│   │   ├── gimbal_api.py
│   │   ├── __init__.py
│   │   ├── price_api.py
│   │   ├── round_type_api.py
│   │   ├── scanner_api.py
│   │   ├── squadron_api.py
│   │   ├── steering_api.py
│   │   ├── thruster_api.py
│   │   ├── user_api.py
│   │   └── weapon_api.py
│   ├── authentication
│   │   ├── __init__.py
│   │   └── login.py
│   ├── crud
│   │   ├── base_crud.py
│   │   ├── drone_crud.py
│   │   ├── gimbal_crud.py
│   │   ├── __init__.py
│   │   ├── item_crud.py
│   │   ├── price_crud.py
│   │   ├── round_type_crud.py
│   │   ├── scanner_crud.py
│   │   ├── squadron_crud.py
│   │   ├── status_crud.py
│   │   ├── steering_crud.py
│   │   ├── thruster_crud.py
│   │   ├── user_crud.py
│   │   └── weapon_crud.py
│   ├── database
│   │   ├── database.py
│   │   ├── drones.db
│   │   ├── drones_test.db
│   │   └── __init__.py
│   ├── enums
│   │   ├── __init__.py
│   │   ├── round_type.py
│   │   └── status.py
│   ├── error
│   │   ├── error.py
│   │   └── __init__.py
│   ├── fixtures
│   │   ├── gimbal_fixtures.py
│   │   ├── __init__.py
│   │   ├── round_type_fixtures.py
│   │   ├── scanner_fixtures.py
│   │   ├── status_fixtures.py
│   │   ├── steering_fixtures.py
│   │   ├── thruster_fixtures.py
│   │   ├── user_fixtures.py
│   │   └── weapon_fixtures.py
│   ├── model
│   │   ├── base_model.py
│   │   ├── drone_model.py
│   │   ├── __init__.py
│   │   └── squadron_model.py
│   ├── request
│   │   ├── __init__.py
│   │   └── json_request_handler.py
│   ├── response
│   │   ├── __init__.py
│   │   └── json_response.py
│   ├── service
│   │   └── calculate_cost.py
│   ├── transformer
│   │   ├── __init__.py
│   │   ├── json_transformer.py
│   │   └── transformer.py
│   └── validation
│       ├── abstract
│       │   ├── __init__.py
│       │   └── validation_abstract.py
│       ├── drone_validation.py
│       ├── field.py
│       ├── __init__.py
│       ├── validation_link.py
│       └── validations.py
└── tests
    ├── drones_test.db
    ├── __init__.py
    ├── test_api
    │   ├── conftest.py
    │   ├── __init__.py
    │   ├── test_auth.py
    │   ├── test_drone.py
    │   ├── test_gimbal.py
    │   ├── test_price_list.py
    │   ├── test_round_type.py
    │   ├── test_scanner.py
    │   ├── test_squadron.py
    │   ├── test_steering.py
    │   ├── test_thruster.py
    │   └── test_weapon.py
    └── test_crud
        ├── conftest.py
        ├── __init__.py
        ├── test_drone_crud.py
        ├── test_gimbal_crud.py
        ├── test_scanner_crud.py
        ├── test_squadron_crud.py
        ├── test_status_crud.py
        ├── test_steering_crud.py
        ├── test_thruster_crud.py
        ├── test_user_crud.py
        └── test_weapon_crud.py

1 Ответ

0 голосов
/ 23 октября 2018

В Python импорт может быть относительным или абсолютным.

Абсолютный импорт разрешается из корневого каталога вашего проекта:

import drone_squadron.api.drone_api

Относительный импорт разрешается из текущего пакета Python.

import ..api.drone

В вашем случае проблема НЕ в относительной / абсолютной путанице, PyCharm всегда добавляет абсолютный импорт.

Проблема в том, что PyCharm, вероятно, рассматривает папку drone_squadron в вашем проекте как"корневая директория".Это неверно!Корневой каталог - это папка верхнего уровня, соответствующая всему проекту git (папка, содержащая LICENSE.md, README.md и т. Д.)

В PyCharm щелкните правой кнопкой мыши папку drone_squadron, затем откройте подменю Mark directory as (внизу), затем выберите Unmark as Source Root.

PyCharm animated screenshot: change root directory

После этого действия ваш импортбудет добавлено так, как вы хотите.

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