【问题标题】:Altering PYTHONPATH at runtime and using a subprocess with a new PYTHONPATH在运行时更改 PYTHONPATH 并使用带有新 PYTHONPATH 的子进程
【发布时间】:2019-05-19 20:28:19
【问题描述】:

我想在运行时更改我的PYTHONPATH(使用 Python 2),放置一个新的PYTHONPATH,执行一个subprocess 并运行我需要 Python3 的特定代码,然后将其设置回原来的样子.

这是我想出的逻辑:

# save the current PYTHONPATH to a variable
pythonpath = os.environ["PYTHONPATH"]
print('PYTHONPATH (Before Execution): ', pythonpath)

# alter the PYTHONPATH
# append or insert would not be the best
# but rather emptying it and putting the new `PYTHONPATH` each time 

# use the following
# subp.Popen("")
# subp.call("") : python3 mycode.py -i receivedImgPath", shell=True
# to call the code with the new PYTHONPATH


# after the code execution is done, set the PYTHONPATH to back
# since we have saved it, use directly the variable pythonpath

有人做过类似的事情吗?我的逻辑正确吗?

P.S:我知道有像 In Python script, how do I set PYTHONPATH? 这样的线程,但它们只提供有关附加或插入的信息,这不符合我的逻辑。

【问题讨论】:

  • 如果这是用于旧版 Python 2.x,请使用标签 python-2.7 或任何适合您问题的标签。除非另有说明,否则我们希望 Python 问题与当前推荐和支持的版本(即 Python 3)有关。
  • 实际上两者都有关,因为问题在于在这两者之间切换。尽管如此,我还是添加了 Python 2.7 标签。

标签: python-3.x python-2.7


【解决方案1】:

subprocess 方便您将单独的环境传递给子进程。

envcopy = os.environ.copy()

# Add '/home/hovercraft/eels' to the start of
# PYTHONPATH in the new copy of the environment
envcopy['PYTHONPATH'] = '/home/hovercraft/eels' + ':' + os.environ['PYTHONPATH']

# Now run a subprocess with env=envcopy
subprocess.check_call(
    ['python3', 'mycode.py', '-i', 'receivedImgPath'],
    env=envcopy)

我们正在修改一个副本,所以父进程的PYTHONPATH 保持原来的值。

如果您需要一个非常简单的环境,也许您所需要的只是

subprocess.check_call(command,
    env={'PYTHONPATH': '/home/myself/env3/lib'})

现代 Python 代码应该更喜欢(Python 3.5+ subprocess.run 以上)subprocess.check_call 而不是 subprocess.call(超过 subprocess.Popen 而不是各种遗留问题,如 os.system);但我猜你被困在 Python 2.x 上。有关(更多!)更多信息,请参阅https://stackoverflow.com/a/51950538/874188

【讨论】:

  • 这就是您要添加到PYTHONPATH 的值。或者实际上我不得不猜测,因为你没有具体说明它应该如何更新。
  • 如果你想传入一个单独的工作目录,这也是可能的。我将添加指向subprocess 文档的链接,查找cwd=
  • cwd= 是否与subprocess.check_call 一起使用?我需要在 Python 3 中运行我的外部文件(这就是切换到另一个 PYTHONPATH 的重点)所以在执行外部文件时我需要 Python 3 表示法,但要切换 Python 2.7。方案有点复杂,希望表达正确
  • 是的。它在我链接到的文档页面的顶部附近:“上面显示的参数只是最常见的参数,下面在常用参数中进行了描述(因此缩写签名中的符号有点奇怪)。完整的函数签名是与 Popen 构造函数相同 - 此函数将所有提供的参数直接传递到该接口。"
猜你喜欢
  • 2019-12-26
  • 2013-01-09
  • 2011-07-16
  • 2013-02-25
  • 1970-01-01
  • 2021-11-25
  • 2019-05-26
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多