3

要查看环境中已安装的库,我在 Jupyter Python 笔记本单元中运行此代码:

%%bash
pip freeze

这可行,但是如何有条件地执行此代码?

这是我的尝试:

from __future__ import print_function
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

def f(x1):
    if(x1 == True):
        f2()
    return x1

interact(f , x1 = False)


def f2():
    %%bash 
    pip freeze

但是评估单元格会引发错误:

  File "<ipython-input-186-e8a8ec97ab2d>", line 15
    pip freeze
             ^
SyntaxError: invalid syntax

要生成我正在使用 ipywidgets 的复选框:https ://github.com/ipython/ipywidgets

更新:pip freezecheck_call返回 0 结果中运行: 在此处输入图像描述

跑步

    %%bash 
    pip freeze

返回已安装的库,因此 0 不正确。

是否subprocess.check_call("pip freeze", shell=True)正确?

更新 2:

这有效:

from __future__ import print_function
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
import subprocess

def f(View):
    if(View == True):
        f2()

interact(f , View = False)


def f2():
    print(subprocess.check_output(['pip', 'freeze']))
4

2 回答 2

3

您可以只使用标准的 Python 方式:

import subprocess
print(subprocess.check_output(['pip', 'freeze']))

然后你的函数将在任何 Python 环境中工作。

于 2017-03-13T12:09:01.063 回答
1

简短的解释是笔记本有交互式命令,由笔记本本身处理,在 Python 解释器甚至看到它们之前。 %%bash是此类命令的一个示例;你不能把它放在 Python 代码中,因为它不是 Python。

usingbash实际上并没有在这里添加任何东西使用 shell 提供了许多交互的好处,当然,在交互式笔记本中,为用户提供对 shell 的访问是允许用户执行外部进程的强大机制;但在这种特殊情况下,通过非交互式执行,将 shell 放在你自己和 之间并没有实际的好处pip,所以你可能只是想要

 import subprocess
 if some_condition:
     p = subprocess.run(['pip', 'freeze'],
         stdout=subprocess.PIPE, universal_newlines=True)

(请注意没有,shell=True因为我们不需要或不需要这里的外壳。)

如果您希望捕获的退出代码或pip freeze它们的输出可用作返回对象的属性p。有关详细信息,请参阅subprocess.run文档。简而言之,p.returncode如果命令成功,则为 0,输出为p.stdout.

旧版本的 Python 有各种各样的特殊用途的包装器,subprocess.Popen比如check_call,check_output等,但这些都被subprocess.run最近的版本所包含。如果您需要支持 3.5 之前的 Python 版本,遗留函数仍然可用,但可以说在新代码中应避免使用它们。

于 2017-03-13T13:14:23.873 回答