【问题标题】:Calling python from perl - methods are not calling properly从 perl 调用 python - 方法调用不正确
【发布时间】:2020-07-28 07:59:13
【问题描述】:

我正在尝试从 Perl 脚本调用 python 脚本。 python脚本导入另一个python文件。 Perl 文件和 python 文件放在不同的目录中。当我尝试直接运行 python 脚本时,它会调用导入 python 文件的构造函数和导入文件的另一种方法并成功运行。然而,当我试图从 Perl 脚本中做同样的事情时,唯一的构造函数被调用。

实用程序.py

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

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

运行.py

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

当我直接运行run.py 时。输出将是第一个构造函数打印,然后是 hello 方法打印。 当我试图从 Perl 脚本 python /app/python/run.py 调用它时,唯一的构造函数是 print 而不是 hello 方法 print。

两个 python 目录都放在文件夹 /app/python 中,Perl 脚本出现在文件夹 app/perl 中。

我有什么遗漏的吗?

【问题讨论】:

    标签: python perl


    【解决方案1】:

    这与 Perl 无关,完全取决于您运行 Python 脚本的目录。

    当您import 一个 Python 模块时,会在sys.path 中列出的目录中搜索该模块。这包括标准库的位置和当前目录。因此,当您从包含 Utility.py 文件的目录运行时,一切正常。

    在这里,您可以应用四种明智的解决方案:

    • 在启动 Python 脚本之前将当前目录更改为 app/python。

    • 将模块的位置添加到 PYTHONPATH 环境变量中。

    • 更好:将您的 Python 脚本转换为可以安装的包,并将其安装在您的系统上,以便可以从 Python 默认显示的位置获取其模块。

    • 更好的是:使用相对导入,以便完全避免 sys.path 查找:

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

      但是,这需要两个模块有一个父包,即是首先加载的某个 __init__.py 目录的一部分。

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 2017-06-21
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多