从 Jupyter Notebook 启动的子进程不使用相同的 python 虚拟环境。为什么以及如何解决?

问题描述 投票:0回答:1

我正在将 python 脚本作为子进程执行。从常规模块执行此操作继承了虚拟环境,但是当我在 Jupyter 笔记本中执行此操作时,子进程正在使用系统 python。这是为什么?如何以独立于平台的方式修复它? (不知道其他用户会使用什么虚拟环境。)

一个最小的例子:

# kernel_printer.py
import sys
import os

def print_kernel():
    kernel_name = os.path.basename(sys.executable.replace("/bin/python", ""))
    print('Kernel: ', kernel_name)


if __name__ == '__main__':
    print_kernel()

要作为脚本或笔记本单元执行的代码:

import subprocess

print(subprocess.run(['python', 'kernel_printer.py'], capture_output=True))

# as module: subprocess output contains print of activated virtualenv 
# as notebook cell: ... systemwide python is printed as current kernel

请注意,jupyter 笔记本确实运行与模块相同的 virtualenv。也就是说,无论在模块还是笔记本单元中运行,以下代码都会打印虚拟环境的名称。

import kernel_printer
kernel_printer.print_kernel()

# always prints name of virtual env
python jupyter virtualenv
1个回答
0
投票

我仍然不知道 Jupyter 的机制,因此不知道为什么会发生这种情况。但我确实找到了一个简单的解决方案。仅当您可以更改正在调用的代码时,这才有效。在这种情况下,您可以使用存储在

sys.executable
中的当前 python 可执行文件,如

import sys
import subprocess

print(subprocess.run([sys.executable, 'kernel_printer.py'], capture_output=True))

# outputs the virtual env as kernel regardless if run as module or notebook cell
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.