импорт: я хочу скрипт может быть запущен другим файлом, а также может быть запущен напрямую - PullRequest
1 голос
/ 15 апреля 2019

У меня есть несколько сценариев (app.py и app2.py), я хочу, чтобы они могли запускаться main.py в родительском каталоге, а также запускаться напрямую.

структура проекта:

main.py
package
├── __init__.py
├── app.py
├── helper.py
package2
├── __init__.py
├── app2.py
├── helper.py

main.py

from package import app
from package2 import app2

пакет / app.py

from .helper import greeting

greeting()

пакет / helper.py

def greeting():
    print('hello')

package2 / app2.py

from .helper import greeting

greeting()

package2 / helper.py

def greeting():
    print('hello in package 2')

когда я запускаю main.py, печатается

hello
hello in package 2

это правильно, но я не могу запустить package/app.py напрямую, он выдаст ошибку attempted relative import with no known parent package

Одно решение, которое я нашел в stackoverflow, это изменение кода внутри main.py на:

import sys
sys.path.insert(0,'package')
sys.path.insert(0,'package2')

from package import app
from package2 import app2

затем удалите точку в app.py и app2.py. Теперь я могу их напрямую, но новая проблема - когда я запускаю main.py, он печатает

hello in package 2
hello in package 2

что не так.

другое решение: app.py и app2.py:

if __name__ == "__main__":
    from helper import greeting
else:
    from .helper import greeting

greeting()

Это решило все мои проблемы, мне просто интересно, это правильный способ сделать это?

...