使用环境变量在Python中调用子进程

6

我试图编写一个Python脚本,自动使用Plex Media Scanner扫描Plex的一个部分。为此,我必须以运行Plex的用户(在这种情况下是“plex”)身份运行扫描程序,同时提供环境变量“LD_LIBRARY_PATH”。我尝试使用subprocess.call和subprocess.Popen,但没有任何输出。以下是我使用的代码:

#!/usr/bin/python
import os
import subprocess
import shlex

env = os.environ.copy()
env['LD_LIBRARY_PATH'] = '/usr/lib/plexmediaserver'
s = "/bin/su - plex -c '/usr/lib/plexmediaserver/Plex\ Media\ Scanner -s -c 2'"
task = shlex.split(s)
exitCode = subprocess.call(task, env=env, shell=True)

现在我已经有一个工作版本,能够按照我的意愿完成任务,但是我不得不使用包装的Bash脚本来实现。您可以查看下面的代码:

#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib/plexmediaserver
/usr/lib/plexmediaserver/Plex\ Media\ Scanner $@

而调用它的相关脚本行:

exitCode = subprocess.call("/bin/su - plex -c '/var/lib/deluge/delugeScripts/pms.sh -s -c 2'", shell=True)

感谢您的帮助。

我怀疑这并不重要,但第一个代码片段中为什么要使用 shell=True - mgilson
@mgilson 这只是我尝试的不同变化之一。我已经在这上面努力了相当长时间,所以有些东西混在了一起。奇怪的是,当我打印 env 时,它有这个变量,但是扫描仪仍然抱怨无法找到它所需的库。 - pyarmak
@pyarmak 在 su 命令中的 - 会使其成为登录 shell,重新初始化环境。 - jordanm
@jordanm 哦,我完全错过了那个。非常感谢您。现在它完美地工作了。 - pyarmak
1个回答

1

正如jordanm在他的评论中指出:

在su命令中加上-,可以使其成为登录shell,重新初始化环境。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接