如何确定Python脚本是否通过命令行运行?

Jac*_*ing 24 python command-line

背景

我希望我的Python脚本在退出之前暂停使用类似于:

raw_input("Press enter to close.")

但仅当它不是通过命令行运行时.命令行程序不应该以这种方式运行.

有没有办法确定我的Python脚本是否是从命令行调用的:

$ python myscript.py

双击myscript.py打开它与操作系统中的默认解释器?

Edu*_*nec 15

如果您在没有终端的情况下运行它,就像在Nautilus中单击"运行"一样,您可以检查它是否附加到tty:

import sys
if sys.stdin.isatty():
    # running interactively
    print "running interactively"
else:
    with open('output','w') as f:
        f.write("running in the background!\n")
Run Code Online (Sandbox Code Playgroud)

但是,正如ThomasK所指出的那样,你似乎指的是在程序结束后关闭的终端中运行它.我认为没有解决办法就没办法做你想做的事; 程序在常规shell中运行并附加到终端.立即退出的决定是在完成它没有现成的信息(传递给执行的shell或终端的参数)之后完成的.

您可以继续检查父进程信息并检测两种调用之间的差异,但在大多数情况下可能不值得.您是否考虑过在命令行中添加命令行参数(想想--interactive)?

  • 我认为这可能是您双击的脚本,终端打开,但脚本完成后立即关闭.看起来OP希望保持终端打开,以便用户在关闭之前检查输出. (7认同)

小智 11

我想要的在这里得到了解答:确定程序是否是从Python脚本中调用的

您可以在“python”和“bash”之间进行确定。我想这已经得到了回答,但你也可以保持简短。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import psutil
import os

ppid = os.getppid() # Get parent process id
print(psutil.Process(ppid).name())
Run Code Online (Sandbox Code Playgroud)


dbr*_*dbr 5

我认为没有任何可靠的方法来检测这一点(特别是以跨平台的方式)。例如,在 OS X 上,当您双击一个.py文件并使用“Python Launcher”进行调整时,它会在终端中运行,与手动执行它的情况相同。

虽然它可能有其他问题,但您可以使用py2exePlatypus之类的东西打包脚本,然后您可以让双击图标运行特定的代码来区分(import mycode; mycode.main(gui = True)例如)


小智 5

如果您运行 python IDLE,则“pythonw.exe”将用于运行编码,而当您运行命令行时,“python.exe”将用于运行编码。python 文件夹路径可能会有所不同,因此您必须恢复 python 文件夹的路径。m = '\\' 和 m = m[0] 是为了让 m 因为转义而变成 '\'。

import sys
a = sys.executable
m = '\\'
m = m[0]
while True:
    b = len(a)
    c = a[(b - 1)]
    if c == m:
        break
    a = a[:(b - 1)]
if sys.executable == a + 'pythonw.exe':
    print('Running in Python IDLE')
else:
    print('Running in Command line')
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接执行 `if 'pythonw.exe' in sys.executable: print('Running in Python IDLE')` ? (2认同)