Вызов python из perl - методы не вызываются должным образом - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь вызвать python скрипт из Perl скрипта. Сценарий python, импортирующий другой файл python. Файл Perl и файлы python размещаются в разных каталогах. Когда я пытаюсь запустить скрипт python напрямую, он вызывает конструктор файла импорта python и другой метод импорта файла и успешно работает. Однако, когда я пытался сделать то же самое из скрипта Perl, вызывался единственный конструктор.

Utility.py

Class DemoCheck :
   def Hello():
   print("Hello")

   Utility(self):
   print("Constructor calling")

run.py

import Utility
const = Utility.DemoCheck
const.Hello()

Когда я работаю run.py напрямую. Выходными данными будет сначала конструктор print, а затем привет метод print. Когда я пытаюсь вызвать его из Perl script python /app/python/run.py, единственным конструктором является print, а не hello, метод print.

Обе директории python помещаются в папку /app/python, а скрипт Perl присутствует в папка app/perl.

Есть ли что-то, что мне не хватает?

1 Ответ

1 голос
/ 15 апреля 2020

Это не связано с Perl и полностью связано с каталогом, из которого вы запускаете скрипт Python.

Когда вы import a Python, модуль ищет модуль в каталогах, перечисленных в sys.path. Это включает в себя местоположение стандартной библиотеки и текущий каталог. Так что все работает, когда вы запускаете из каталога, включающего файл Utility.py.

Здесь есть четыре разумных решения, которые вы можете применить:

  • Изменить текущий каталог в app / python перед запуском сценария Python.

  • Добавьте расположение ваших модулей в переменную среды PYTHONPATH.

  • Лучше: превратите ваш сценарий Python в пакет, который можно установить, и установите его в своей системе, чтобы его модули были доступны в местах, где Python выглядит по умолчанию.

  • Еще лучше: используйте относительный импорт, чтобы полностью исключить поиск sys.path:

    from .Utility import DemoCheck
    #    ^--
    DemoCheck().Hello()
    

    Однако для этого требуется, чтобы два модуля имели родительский пакет, то есть были частью некоторого каталога __init__.py который был загружен первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...