3

I'm using PyCharm and often rely on the alt+enter shortcut to automatically import classes and functions.

However, it doesn't use the absolute import path. It works fine locally but when I push to GitHub my tests fail in TravisCI.

Does anyone know a way to force PyCharm to import with the absolute path?

I need to import like this drone_squadron.api.drone_api if I use something like this api.drone_api the remote tests can't find the import. This is for all local imports.

I'd prefer for all imports to be absolute, all the time. Relative imports have caused me problems in packaging up projects. I think it's just easier to use absolute imports all the time.

Git Repo

https://github.com/sarcoma/drone_squadron_api_prototype

Tree Structure

.
├── 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
OrderAndChaos
  • 3,547
  • 2
  • 30
  • 57
  • Please give an example of a bad import including the related project structure! – Klaus D. Oct 23 '18 at 12:57
  • Your project is probably badly configured regarding root folder and main (top level) package. Please provide more information (its tree structure, the error you get on travis ci, etc.) – Antwane Oct 23 '18 at 13:17
  • @KlausD. I've added further data, does that help at all? – OrderAndChaos Oct 23 '18 at 13:43
  • @Antwane I've added more data, does that help? I don't have the error message to hand, I can break it and get it if needed. – OrderAndChaos Oct 23 '18 at 13:44

1 Answers1

11

In Python, imports can be relative or absolute.

Absolute imports are resolved from your project's root directory:

import drone_squadron.api.drone_api

Relative imports are resolved from the current python package.

import ..api.drone

In your case, the issue is NOT a relative/absolute confusion, PyCharm always add absolute imports.

The problem is that PyCharm probably consider the folder drone_squadron in your project as a "root directory". That's wrong! The root directory is the top-level folder corresponding to the whole git project (the folder containing LICENSE.md, README.md, etc.)

In PyCharm, right click on the folder drone_squadron, then open sub-menu Mark directory as (in the bottom) then select Unmark as Source Root.

PyCharm animated screenshot: change root directory

After that action, your import will be added the way you want.

Antwane
  • 20,760
  • 7
  • 51
  • 84