локальный модуль Python с тем же - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть локальный репозиторий кода Python, как показано ниже.В python/foo/code.py я хочу импортировать target_module в foo/bar/baz/target_module.Однако, поскольку code.py находится под модулем foo, я не могу импортировать target_module.Поскольку это большое репо с большим количеством устаревшего кода, я не могу легко изменить любое имя каталога.Есть ли другой обходной путь?

Заранее спасибо!

|──foo
|   ├──bar
|         ├──baz
|               ├── target_module
├── python
|   ├── foo
|   │   ├── code.py      <----from foo.bar.baz.target_module import *

1 Ответ

0 голосов
/ 20 сентября 2018

Есть несколько способов сделать это.Быстро и грязно просто добавить его к пути вашего переводчика.

Вот мои настройки:

Matthews-MacBook-Pro:test_project matt$ tree
.
├── foo
│   └── bar
│       └── baz
│           └── target_module.py
└── python
    └── foo
        └── code.py

5 directories, 2 files

Вот содержимое target_module.py:

def my_func():
    print("my func called.")

и как вы можете импортировать эту функцию в code.py:

import os
import sys

# Cheat and just add it to python interpreter's path                                                                                                                                                        
this_dir = os.path.dirname(__file__)
sys.path.append(os.path.join(this_dir, "..", "..", "foo", "bar", "baz"))

import target_module as tm
tm.my_func()

, это выдаст:

Matthews-MacBook-Pro:test_project matt$ python python/foo/code.py 
my func called.

или вы можете вызвать ее из каталога foo, и она все еще будет работатьштраф:

Matthews-MacBook-Pro:test_project matt$ cd python/foo/
Matthews-MacBook-Pro:foo matt$ python code.py 
my func called.

Вы также можете просто добавить каталог foo/bar/baz в переменную окружения PYTHONPATH вместо вызова sys.path.append.Этот синтаксис зависит от оболочки: поэтому я дам вам Google, как установить переменные окружения для вашей конкретной оболочки.

В идеале вы хотите сделать ваши модули развертываемыми (т.е. использовать * 1028).* и distutils или setuptools и поместите __init__.py в каждый модуль), а затем вы можете импортировать "как обычно" (вроде как вы можете "просто" import numpy, и это работает). Но так как вы заявляете, что это наследие, возможно, вам будет трудно это сделать.Я понял: в устаревших системах все ставки выключены, а иногда быстрая и грязная - это хорошо (и, возможно, даже идеально, если вы не хотите тратить много времени на решение проблемы).

Я могу расширить этот ответ, если вы заинтересованы в создании развертываемых пакетов Python, а если нет, то вышеперечисленное должно выполнить работу.

HTH.

...