Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从perl调用python-方法调用不正确_Python_Perl - Fatal编程技术网

从perl调用python-方法调用不正确

从perl调用python-方法调用不正确,python,perl,Python,Perl,我试图从Perl脚本调用python脚本。导入另一个python文件的python脚本。Perl文件和python文件放在不同的目录中。当我试图直接运行python脚本时,它调用了import python file的构造函数和import file的另一个方法并成功运行。然而,当我试图从Perl脚本执行同样的操作时,唯一的构造函数被调用 实用程序.py Class DemoCheck : def Hello(): print("Hello") Utility(self):

我试图从Perl脚本调用python脚本。导入另一个python文件的python脚本。Perl文件和python文件放在不同的目录中。当我试图直接运行python脚本时,它调用了import python file的构造函数和import file的另一个方法并成功运行。然而,当我试图从Perl脚本执行同样的操作时,唯一的构造函数被调用

实用程序.py

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

   Utility(self):
   print("Constructor calling")
run.py

import Utility
const = Utility.DemoCheck
const.Hello()
当我直接运行
run.py
时。输出将首先是构造函数打印,然后是hello方法打印。 当我试图从Perl脚本调用它时,惟一的构造函数是print而不是hello方法print

这两个python目录都放在文件夹
/app/python
中,Perl脚本则放在文件夹
app/Perl


有什么我遗漏的吗?

这与Perl无关,完全是由于运行Python脚本的目录

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

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

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

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

  • 更好:将您的Python脚本转换成一个可以安装的包,并将其安装到您的系统上,以便其模块可以从Python默认外观的位置获得

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

    from.Utility导入DemoCheck
    #    ^--
    DemoCheck().Hello()
    
    但是,这要求两个模块都有一个父包,即是首先加载的某个
    \uuuu init\uuuuu.py
    目录的一部分