【问题标题】:How to access Environment variables set in python from perl using Inline::python如何使用 Inline::python 从 perl 访问在 python 中设置的环境变量
【发布时间】:2020-10-26 10:14:13
【问题描述】:

我有以下文件可以使用 perl 中的 python API AnimalsWrapper.py:

import os
class AnimalsWrapper():
    def __init__(self):
        self.name = 'dog '

    def getName(self):
        os.environ['HELLO'] = 'test'
        return self.name + '\n'

AnimalsWrapper.pm:

package AnimalsWrapper;

use parent qw(PythonBase);

package main;
use Inline Python;
our %ENV;

1;

PythonBase.pm

package PythonBase;

use Inline Python => <<"END";

import sys
sys.path.append('<pkgpath>/python3/3.6.3a/bin/python3')
sys.path.append('<pkgpath>/python3/3.6.3a/lib/python3.6/site-packages/')

END

1;

这是我用来调用 python API 的 perl 脚本。

#!/usr/bin/perl
use strict;
use warnings;

use lib '<path to the above python code>';

use AnimalsWrapper;
our %ENV;
my $obj = AnimalsWrapper->new();
print $obj->getName();
print $ENV{HELLO}; ==> here this says its uninitalized. 

通过这种方式没有 IPC,并且从 perl 调用 python API 时,它的进程相同,但环境变量仍然不可用。感谢您提供任何帮助或建议。

【问题讨论】:

    标签: python perl


    【解决方案1】:

    这是从 shell 到 Perl 再到 Python 的单程旅行。环境不能污染它们的包装环境,否则可能会发生可怕的事情。作为用户,如果在您的环境可以被另一个进程更改时运行命令,您将无法相信会发生什么。

    您可以将环境的完全控制权委托给更高的地方,比如在您的 shell 环境中,或者您需要一个带外方法来返回属性,例如通过编写一个 shell 文件(慢!)或编写到一个套接字(复杂)。

    为了理解和最大的可预测性,我更喜欢在父 shell 中进行 $ENV 控制。希望您已经考虑将 pyenvvirtualenv 作为管理自定义 python 安装的方法。

    否则,您可以在包装器中执行将返回这些值的单行代码,例如:

    my $python_path = exec('which python')

    my $python_path = exec('python -c "import sys; print(sys.executable)"')

    我的偏好是让 virtualenv 完成工作,但我怀疑你的情况并不理想。

    【讨论】:

      【解决方案2】:

      运行程序时会导入环境变量。您可以在运行时修改它们,它们只会为程序的环境设置。例如,您的 bash 会话环境变量不会被修改。 https://perldoc.perl.org/5.32.0/Env.html

      #!/usr/bin/perl
      use strict;
      use warnings;
      
      use lib '<path to the above python code>';
      use AnimalsWrapper;
      
      $ENV{"HELLO"} = "hello_text";
      my $obj = AnimalsWrapper->new();
      print $obj->getName();
      print $ENV{"HELLO"}; 
      

      【讨论】:

      • 其实我不想在 perl 中改变环境变量。 $obj->getName() 在 python 中设置它,我想在 perl 中访问 python 设置的那个值。
      猜你喜欢
      • 2011-08-23
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多