【问题标题】:Determine if the program is called from a script in Python确定程序是否从 Python 中的脚本调用
【发布时间】:2015-03-24 17:57:41
【问题描述】:

做事

#!/bin/sh
myexe

myexe

if sys.stdout.isatty():
    print 'from a script'
else:
    print 'not from a script'

输出(如果我从终端执行 doa):

not from a script

输出(如果我从终端执行 myexe):

not from a script

如果从 doa 执行,我希望它说 'from a script'

问题:myexe 是否有可能知道它是从 bash 脚本执行的?

【问题讨论】:

  • 我不知道一种方法来检测文件是否是从脚本调用的(理论上,它总是由脚本调用,无论是批处理脚本,命令行,你的鼠标双击它)。您可以改为从脚本中传递一个参数以使用 sys.argv[index] 检测并告诉它从哪里调用它。
  • 一个 bash 脚本,而不是什么?你的sh 脚​​本?交互式外壳?什么时候重要?
  • 查看 stdout 是否是 TTY 是一种常见的、明智的检查,因为它可以让您决定是以人类可读的格式还是计算机可读的格式输出(例如,连接到 TTY 时的彩色输出,纯当管道传输到另一个进程时输出)。但是检查你的程序是如何被调用的......根据父进程的身份你会做些什么不同的事情——以及为什么
  • 从您的终端与从脚本调用
  • 我很确定答案是否定的。你真正想解决什么问题?

标签: python bash shell sh


【解决方案1】:

你可以使用psutil来询问进程的名字,id是父进程id:

import psutil
import os

ppid = os.getppid() # Get parent process id
psutil.Process(ppid).name() == "bash"

您可以使用pip 命令安装psutil

pip install psutil

【讨论】:

  • 如果用户的控制台也是bash,那么这将无法确定是从脚本运行还是直接从控制台运行...
  • 我知道我以 bash 为例,但我想包含整个脚本。 myexe 可以从另一个 python 脚本或其他脚本调用
  • @BillLynch 你能检查用户控制台是否是 bash,然后与之比较吗?哦等等 nvm.. 嗯..
  • @ealeon:您通常可以通过检查$SHELL 来判断用户控制台是否为 bash。但就个人而言,这一切都是个坏主意。
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2011-05-14
相关资源
最近更新 更多