How to determine if Python script was run via command line?

前端 未结 11 1702
心在旅途
心在旅途 2020-12-15 03:58

Background

I would like my Python script to pause before exiting using something similar to:

raw_input(\"Press enter to close.\")

but

11条回答
  •  天命终不由人
    2020-12-15 04:52

    Update for later versions (e.g. Python 3.6 on Ubuntu 16.04): The statement to get the name has changed to psutil.Process(os.getpid()).parent().name()


    I believe this CAN be done. At least, here is how I got it working in Python 2.7 under Ubuntu 14.04:

    #!/usr/bin/env python
    import os, psutil
    
    # do stuff here
    
    if psutil.Process(os.getpid()).parent.name == 'gnome-terminal':
        raw_input("Press enter to close...")
    

    Note that -- in Ubuntu 14 with the Gnome desktop (aka Nautilus) -- you might need to do this:

    • from a Nautilus window (the file browser), select Edit(menu)->Preferences(item) then Behavior(tab)->Executable Text Files(section)->Ask Each Time(radio).
    • chmod your script to be executable, or -- from a Nautilus window (the file browser) -- right click on the file->Properties(item) then Permissions(tab)->Execute:Allow executing file as program(checkbox)
    • double-click your file. If you select "Run in Terminal", you should see the "Type enter to close..." prompt.
    • now try from a bash prompt; you should NOT see the prompt.

    To see how this works, you can fiddle with this (based on the answer by from @EduardoIvanec):

    #!/usr/bin/env python
    import os
    import sys
    import psutil
    
    def parent_list(proc=None, indent=0):
        if not proc:
            proc = psutil.Process(os.getpid())
        pid = proc.pid
        name = proc.name
        pad = " " * indent
        s = "{0}{1:5d} {2:s}".format(pad, pid, name)
        parent = proc.parent
        if parent:
            s += "\n" + parent_list(parent, indent+1)
        return s
    
    def invoked_from_bash_cmdline():
        return psutil.Process(os.getpid()).parent.name == "bash"
    
    def invoked_as_run_in_terminal():
        return psutil.Process(os.getpid()).parent.name == "gnome-terminal"
    
    def invoked_as_run():
        return psutil.Process(os.getpid()).parent.name == "init"
    
    
    if sys.stdin.isatty():
        print "running interactively"
        print parent_list()
        if invoked_as_run_in_terminal():
            raw_input("Type enter to close...")
    
    else:
        with open('output','w') as f:
            f.write("running in the background!\n")
            f.write("parent list:\n")
            f.write(parent_list())
    

提交回复
热议问题