Как правильно вызывать функции, определенные в других каталогах в Python? - PullRequest
0 голосов
/ 23 мая 2019

Извините, на этот вопрос уже был получен ответ, но я не могу найти ответ на свою проблему ... Я хочу сделать два отдельных сценария вызываемыми. Позвольте мне подробно объяснить на примере.

У меня есть структура каталогов, подобная этой:

maindir
|- subdir
|   |- script.py
|   `- myfunc.py
`- main.py

со следующим содержанием:

В myfunc.py есть

def myverynicefunc():
    print('Hello, I am your very nice func :)')

в script.py есть

import myfunc

def scriptfunc():
    print('I am the script function :)')

myfunc.myverynicefunc()

и в main.py есть

from subdir.script import scriptfunc

scriptfunc()

Если я захожу в каталог subdir и выполняю скрипт, он работает, я имею в виду:

.../main_dir/subdir$ python3 script.py 
Hello, I am your very nice func :)

Однако, если я пытаюсь выполнить сценарий main.py, он завершается неудачно:

.../main_dir$ python3 main.py 
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from subdir.script import scriptfunc
  File "/home/alf/Escritorio/main_dir/subdir/script.py", line 1, in <module>
    import myfunc
ModuleNotFoundError: No module named 'myfunc'

Если я изменю содержание script.py на

from . import myfunc

def scriptfunc():
    print('I am the script function :)')

myfunc.myverynicefunc()

теперь ситуация обратная, скрипт main.py работает нормально:

.../main_dir$ python3 main.py 
Hello, I am your very nice func :)
I am the script function :)

, но сценарий script.py завершается ошибкой:

.../main_dir/subdir$ python3 script.py 
Traceback (most recent call last):
  File "script.py", line 1, in <module>
    from . import myfunc
ImportError: cannot import name 'myfunc'

Есть ли способ сделать оба звонка на main.py и script.py на работу?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Попробуйте это в вашем script.py -

import sys
current_path = sys.path[0]
if current_path.split('/')[-1] != 'subdir':
    sys.path.insert(0, current_path+'/subdir/')
    import myfunc

Таким образом, если текущий каталог для python является родительским каталогом файла, то есть maindir, он изменит путь к каталогу и затем импортирует его.

При этом он должен работать в обоих сценариях. Надеюсь это поможет. :)

0 голосов
/ 24 мая 2019

со вторым сценарием вы можете сделать python3 -c "import subdir.script" в вашем основном каталоге

...