Marc B. Hankin
Marc B. Hankin

Reputation: 751

Use a Python Module to Open Explorer on a file

I'm a python newbie, and I'm having some difficulty making a module out of some very useful code located at: Open explorer on a file.

I can't figure out what I am doing wrong.

I get the following error messages:

line 31: C:\Apps\E_drive\Python_win32Clipboard.pdf line 34: r'explorer /select, "C:\Apps\E_drive\Python_win32Clipboard.pdf"' Traceback (most recent call last): File "P:\Data\VB\Python_MarcsPrgs\Python_ItWorks\Open_Win_Explorer_and_Select_File.py", line 42, in Open_Win_Explorer_and_Select_Fil(filepath) File "P:\Data\VB\Python_MarcsPrgs\Python_ItWorks\Open_Win_Explorer_and_Select_File.py", line 35, in Open_Win_Explorer_and_Select_Fil subprocess.Popen(Popen_arg) File "C:\Python27\lib\subprocess.py", line 679, in init errread, errwrite) File "C:\Python27\lib\subprocess.py", line 893, in _execute_child startupinfo) WindowsError: [Error 2] The system cannot find the file specified

here's my module:

"""
Open Win Explorer and Select File
# "C:\Apps\E_drive\Python_win32Clipboard.pdf"
"""
import sys
import os, subprocess, pdb

def fn_get_txt_sysarg():
    "Harvest a single (the only) command line argument"
    # pdb.set_trace()
    try:
        arg_from_cmdline = sys.argv[1]
        arg_from_cmdline = str(arg_from_cmdline)
        
    except:
        this_scriptz_FULLName = sys.argv[0]
        
        ErrorMsg = "Message from fn_get_txt_sysarg() in Script (" + this_scriptz_FULLName + '):\n' \
        + "\tThe Script did not receive a command line argument (arg_from_cmdline)"
        
    returnval = arg_from_cmdline

    return returnval


def Open_Win_Explorer_and_Select_Fil(filepathe):
    # harvested from... https://stackoverflow.com/questions/281888/open-explorer-on-a-file
    #import subprocess 
    #subprocess.Popen(r'explorer /select,"C:\path\of\folder\file"') 
    f = str(filepathe)
    print "line 31: " + f
    Popen_arg = "r'explorer /select, " + '"' + f + '"' + "'"
    Popen_arg = str(Popen_arg)
    print "line 34: " + Popen_arg
    subprocess.Popen(Popen_arg)


if __name__ == '__main__': 

    filepath = fn_get_txt_sysarg()
    
    Open_Win_Explorer_and_Select_Fil(filepath)    

Upvotes: 3

Views: 5168

Answers (2)

GreenMatt
GreenMatt

Reputation: 18570

I copied your code and ran it on my machine and found two errors. The answer srgerg provided addresses one of these errors. The other is that Python triggers an error in fn_get_txt_sysarg() when there is no argument specified on the command line. Below is some sample code, with the errors fixed and some other clean ups:

"""
Open Win Explorer and Select File
"""
import sys
import subprocess

def fn_get_txt_sysarg():
    """Harvest a single (the only expected) command line argument"""
    try:
        return sys.argv[1]    # str() would be redundant here
    except:
        ErrorMsg = 'Message from fn_get_txt_sysarg() in Script (' + sys.argv[0] + '):\n' + '\tThe Script did not receive a command line argument'
        sys.exit(ErrorMsg)

def Open_Win_Explorer_and_Select_Fil(filepath):
    # harvested from: https://stackoverflow.com/questions/281888/open-explorer-on-a-file
    Popen_arg = 'explorer /select,"' + filepath + "'"    # str() is redundant here also
    subprocess.Popen(Popen_arg)

if __name__ == '__main__': 
    filepath = fn_get_txt_sysarg()
    Open_Win_Explorer_and_Select_Fil(filepath)

Upvotes: 4

srgerg
srgerg

Reputation: 19329

I think the problem is with the initialisation of Popen_arg. Notice from the output that the value of Popen_arg is:

r'explorer /select, "C:\Apps\E_drive\Python_win32Clipboard.pdf"'

This is actually a python raw string literal. You want Popen_arg to have the value which this string literal represents, not this string literal itself. I think if you change it to

Popen_arg = r'explorer /select, "' + f + '"'

it will work better. Note also that the line:

Popen_arg = str(Popen_arg)

has no effect and can be safely removed.

Upvotes: 7

Related Questions