У меня есть модуль - давайте назовем его foo
- и я хочу, чтобы его можно было использовать с помощью вызова python -m foo
.Моя программа выглядит следующим образом:
my_project
├── foo
│ └── __init__.py
└── my_program.py
В __init__.py
У меня есть код, который я запускаю при вызове python -m foo
:
def bar(name):
print(name)
# -- code used to 'run' the module
def main(name):
bar("fritz")
if __name__ == "__main__":
main()
Поскольку у меня достаточно кода выполненияв __init__.py
сейчас (argparse
материал и некоторая логика) я хочу разделить его на __main__.py
:
my_project
├── foo
│ ├── __init__.py
│ └── __main__.py
└── my_program.py
Несмотря на то, что это выглядит очень просто для меня, мне не удалось импортировать материал, расположенныйв __init__.py
с __main__.py
пока.
Я знаю - если foo
находится в site-packages
или доступен через PYTHONPATH
, я могу просто import foo
..
Нов случае, если я хочу выполнить __main__.py
напрямую (например, из некоторой IDE) с foo
, расположенным в любом месте (т.е. не в папке, где Python ищет пакеты) - есть ли способ импортировать foo
(__init__.py
из того же каталога)?
Я пробовал import .
и import foo
- но оба подхода терпят неудачу (потому что они, конечно, означают что-то другое, конечно)
То, что я могу сделать - по крайней мере, чтобы объяснить мою цель - примерно так:
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
import foo
Работает, но уродливо и немного опасно, так какЯ даже не знаю, действительно ли я импортирую foo
из того же каталога ..