【问题标题】:Executing terminal cmd from Python code returns different result in IDE and terminal itself从 Python 代码执行终端 cmd 在 IDE 和终端本身中返回不同的结果
【发布时间】:2018-07-15 06:37:18
【问题描述】:

我想在 Python 代码中执行which jupyter 命令,以便接收我的jupyter 二进制文件的位置。

我的 Python 脚本名为 ReportGenerator.py 如下所示:

from subprocess import call

if __name__ == "__main__":
    call(["which", "jupyter"])

输出是:

但是如果我导航到终端中的同一个文件夹并执行代码 Python 脚本,那么:

Kamils-MacBook-Pro-2:project F1sherKK$ python3 ReportGenerator.py /Users/F1sherKK/.pyenv/versions/3.6.1/bin/jupyter

它有效...所以我确保我的 PyCharm IDE 使用与我的终端相同的 python 3.6.1。我目前没有使用任何 virtualenv。

有人可以解释为什么会这样吗?

【问题讨论】:

  • 您的 IDE 正在使用不同的环境。您应该Edit Run configurations... 并指定正确的PATH
  • 哦,所以问题是 Environment variables: 设置为 PYTHONUNBUFFERED=1
  • 是的。 PYTHONUNBUFFERED 与它无关。您要确保已正确配置 IDE 环境。如果不提及它的配置方式,我们将无法为您提供帮助。

标签: python python-3.x terminal subprocess


【解决方案1】:

我不知道为什么会这样,但这是我用于从控制台和 cron 运行的代码:

def which(name):
'''
Replace unix 'which' command.
Tested on windows10 and linux mint. Should work on all platforms.
:param name: Requested command name
:type name: str
:return: Full path to command
:rtype: str
'''
for path in os.getenv("PATH").split(os.path.pathsep):
    full_path = path + os.sep + name
    if os.path.exists(full_path) and os.access(full_path, os.X_OK):
        return full_path
raise ValueError('Cant fint command %s')%name

编辑: 在 Windows 上,该函数将返回非可执行文件的值。 要为 Windows 编写自己的解决方案,请参阅:descusion

【讨论】:

    【解决方案2】:

    subprocess.call() 执行给定的命令并返回命令的返回码(0 => 好的,其他都是错误)。

    交互式 Python shell(无论是否嵌入在您的 IDE 中)显示命令的 stdout 和 stderr 流以及返回代码,但这只是交互式 Python shell 的一个工件 - 正如您注意到的那样,这不会如果您运行与脚本相同的代码,则将任何内容打印到标准输出。

    这里你想使用subprocess.check_output(),它将命令的输出作为字符串返回。然后你需要明确地把这个字符串打印到你的 python 的进程标准输出:

    import subprocess
    
    if __name__ == "__main__":
        found = subprocess.check_output(["which", "jupyter"])
        print(found)
    

    【讨论】:

    • subprocess.CalledProcessError: Command '['which', 'jupyter']' 返回非零退出状态 1。
    • @F1sher 是的,这就是您在命令失败时得到的结果,如文档所述。当which 找不到jupyter 时,您没有指定输出应该是什么,所以我没有添加任何错误处理代码。现在,您的工作就是按照您认为合适的方式处理此案。
    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 2018-07-09
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2022-11-09
    • 2018-08-19
    相关资源
    最近更新 更多