Package: show-in-file-manager
Show in File ManagerShow in File Manageris a Python package to open the system file manager
and optionally select files in it. The point is not toopenthe files,
but toselectthem in the file manager, thereby highlighting the
files and allowing the user to quickly do something with them.Plenty of programs expose this functionality in their user interface. On
Windows terms like "Show in Windows Explorer", "Show in Explorer", and
"Reveal in Explorer" are common. Cross-platform programs use terms like "Open
Containing Folder" or "Open in File Browser", all doing something similar:Commands like these open the file manager, ideally with the files selected:WithShow in File Manager, your Python program or command line script
can do the same, with minimum effort from you.
Although this package provides several functions to assist in identifying
the the system's file managers, in most circumstances you need to call only
one function, the functionshow_in_file_manager, and it should just work.This package aspires to be platform independent, but it currently supports
only Windows 10/11, Linux,WSL1 and WSL2, and macOS.
It works with 19supported file managers.Install and runpython3-mpipinstallshow-in-file-managerGenerate the man page:python3setup.pybuild_pandocYou can import it as a Python module:fromshowinfmimportshow_in_file_managershow_in_file_manager('/home/user/file.txt')Or run it from the command line:showinfilemanagerfile1.txtfile2.txtshowinfilemanager.exe D:\Documents\*.docxMoreexamplesare below.RationaleThis package solves the following problems:What is the operating system's stock file manager?What is the user's choice of file manager?Is the user's choice of file manager set correctly?How do I supply command line arguments to select files in the file manager?What about file managers with limited features?There is no standard command line argument with which to open an operating
system's file manager and select files at a specified path. Moreover, not
all file managers support specifying files to select — if you try to
pass a file to some file managers, they will open the file instead of
selecting it, or worse yet display an error message. Some file managers will
only allow selecting one file at a time from the command line.On desktop Linux the problem is especially acute, as Linux provides a
plethora of file managers, with widely varying command line arguments.
Moreover, the user's default file manager can sometimes be incorrectly set
to nonsensical values, such as an AppImage or Flatpak of a random application.Windows is not without its share of limitations. Windows Explorer will select
only one file at a time when called from the command line, and the argument
must be quoted in a way peculiar to it. Rather than using the command line
to launch Windows Explorer, this package instead uses theWin32 APIto programmatically select multiple files. Using the Win32 API is not
possible when calling Windows Explorer from within WSL — this package
will launchexplorer.exeusing the command line under WSL. Calling Windows
Explorer from within WSL is not trivial due to differences in URI and path
formats between Windows and Linux.Supported file managersThis package takes care of calling the file managers with the correct
arguments for you. The command line arguments shown here are for reference.All but two file managers acceptURIslikefile:///home/user/file.txtin addition to regular paths like/home/user/file.txt.File ManagerUsed byCommand lineCan Select FilesHandles Multiple Files / DirectoriesNotesWindows File ExplorerWindows 10 / 11, Windows Subsystem for Linux (WSL)explorer.exe /select,URI✅⚠No space between comma and URI. Can specify only one URI via the command line, but multiple files can be specified via the Win32 API.FindermacOSopen --reveal URI✅❌Nautilus (Files)Gnome, Pop!_OS, Zorinnautilus --select URI1 URI2✅⚠Multiple URIs open multiple Nautilus windows. Seeissue #1955.DolphinKDEdolphin --select URI1 URI2✅✅A regression in recent KDE releases means--selectis ignored, but it is fixed in KDE Neon testing.NemoLinux Mintnemo URI1 URI2✅⚠Multiple URIs open multiple Nemo windows. Cannot select folders.Elementary OS FilesElementary OSio.elementary.files URI1 URI2✅⚠Multiple URIs open multiple Files tabs. Cannot select folders.Deepin File ManagerDeepindde-file-manager --show-item URI1 URI2✅⚠Multiple URIs open multiple Deepin File Manager tabs.PeonyUbuntu Kylinpeony --show-items URI1 URI2✅✅CajaMatecaja --select URI1 URI2⚠⚠Starting with 1.26, can select a file or folder using--select. In all versions, specifying a file without this switch causes an error. Multiple URIs open multiple Caja windows. Seeissue #1547.ThunarXFCEthunar URI1 URI2❌⚠Specifying a file opens it. Multiple URIs open multiple Thunar windows.PCManFMLXDEpcmanfm  URI❌❌Specifying a file opens it. Multiple URIs open only the first URI.PCManFM-QtLXQtpcmanfm-qt URI1 URI2❌⚠Specifying a file opens it. Multiple URIs open multiple PCManFM-Qt windows.CutefishOS File ManagerCutefishOScutefish-filemanager URI❌❌Specifying a file causes File Manager to attempt to open it as if it is a folder. Multiple URIs open only the first URI.IndexLinuxindex URI1 URI2❌❌Specifying a file has no effect. Multiple URIs open multiple tabs, in addition to the user's home directory, which is always opened.Double CommanderWindows, Linuxdoublecmd URI1 URI2✅⚠A double panel file manager accepting up to two URIs. Cannot select folders.KrusaderKDEkrusader URI❌⚠A double panel file manager accepting one URI. Two URIs can be specified using--leftand--right, but that is unsupported by this package. Specifying a file causes an error.SpaceFMLinuxspacefm URI1 URI2❌✅Specifying a file opens it.fmanWindows, Linux, macOSfman path1 path2✅⚠A double panel file manager accepting up to two paths. Cannot select folders. Does not accept URIs.InsightLumina Desktoplumina-fm path1 path2❌✅Specifying a file displays it in the left pane as if it were a folder. Does not accept URIs.UsageOpen the file manager with the files to selectdefshow_in_file_manager(path_or_uri:Optional[Union[str,Sequence[str]]]=None,open_not_select_directory:Optional[bool]=True,file_manager:Optional[str]=None,verbose:bool=False,debug:bool=False,)->None:"""Open the file manager and show zero or more directories or files in it.The path_or_uri is a sequence of items, or a single item. An item canbe regular path, or a URI.On non-Windows platforms, regular paths will be converted to URIs whenpassed as command line arguments to the file manager, because some filemanagers do not handle regular paths correctly. However, URIs will beconvereted to paths to handle file managers that do not accepts URIs.On Windows, Explorer is called using the Win32 API.On WSL1, all paths are opened using Windows Explorer. URIs and can bespecified using Linux or Windows formats. All formats are automaticallyconverted to use the Windows URI format.WSL2 functions the same as WSL1, except if the WSL2 instance has a Linuxfile manager installed. On these systems, if a path on Linux isspecified, that file manager will be used instead of Windows Explorer. Youcan override this default behavior by using the parameter file_manager.The most common use of this function is to call it without specifyingthe file manager to use, which defaults to the value returned byvalid_file_manager()For file managers unable to select files to display, the file managerwill instead display the contents of the path.For file managers that can handle file selections, but only one at time,multiple file manager windows will be opened.If you specify a file manager executable and this package does notrecognize it, it will be called with the files as the only command linearguments.:param path_or_uri: zero or more files or directories to open, specifiedas a single URI or valid path, or a sequence of URIs/paths.:param open_not_select_directory: if the URI or path is a directory andnot a file, open the directory itself in the file manager, rather thanselecting it and displaying it in its parent directory.:param file_manager: executable name to use. If not specified, thenvalid_file_manager() will determine which file manager to use.:param allow_conversion: allow this function to automatically convert pathsand URIs to the format needed by the file manager that will be called. Setto False if passing non-standard URIs. Ignored when running under WSL.:param verbose: if True print command to be executed before launchingit:param debug: if True print debugging information to stderr"""Other functions mentioned below are not necessary to call, but are provided
for convenience and control.Determine the most sensible choice of file managerdefvalid_file_manager()->str:"""Get user's file manager, falling back to using sensible defaults.The user's choice of file manager is the default choice. However, this isnot always set correctly. On Linux, it most likely is because the user'sdistro has not correctly set the default file manager. If the user's choiceis unrecognized by this package, then reject it and choose the standard filemanager for the detected desktop environment.All exceptions are caught, except those if this platform is not supported bythis package.:return: If the user's default file manager is set and it is recognizedas valid by this package, then return it. Otherwise return the stock filemanager, if it exists."""This package makes opinionated choices about the most sensible choice of
file manager:A file manager is valid if and only if this package recognizes it, e.g.nautilus,explorer.exe.If the user's choice of file manager is valid (i.e. an actual file
manager, not some random application), that file manager is used.If the user's choice of file manager is invalid or could not be
determined, the desktop or OS's stock file manager is used.Get the operating system's stock file managerdefstock_file_manager()->str:"""Get stock file manager for this operating system / desktop.On Windows the default is `explorer.exe`. On Linux the first stepis to determine which desktop is running, and from that lookup itsdefault file manager. On macOS, the default is finder, accessedvia the command 'open'.Exceptions are not caught.:return: executable name"""Get the user's choice of file managerdefuser_file_manager()->str:"""Get the file manager as set by the user.Exceptions are not caught.:return: executable name"""On Windows and macOS, for now only the stock file manager is returned. That
could change in future releases.On Linux, the file manager is probed usingxdg-mime query default  inode/directory, and the resulting.desktopfile is parsed to extract the
file manager command.ExamplesFrom Python, show file or directory in file manager, using the most sensible
choice of file manager:# Windows path, in Windows or from within WSLshow_in_file_manager('C:\Documents\myfile.txt')# Windows URI, in Windows or from within WSLshow_in_file_manager('file://C:/Documents/myfile.txt')# Mixing Windows and Linux style URIs and paths, from within WSLshow_in_file_manager(('file:///C:/Documents/myfile.txt','/mnt/d/Data/database.sqlite','/home/user/.profile','file:/etc/fstab'),file_manager='explorer.exe')# Linux pathshow_in_file_manager('/home/user/myfile.txt')# Linux multiple pathsshow_in_file_manager(('/home/user/myfile.txt','/home/user/other file.txt'))# Mixing Linux URI and Linux pathshow_in_file_manager(('file:///home/user/other%20file.txt','/home/otheruser/.bashrc'))# Simply open the file managershow_in_file_manager()# Open the file manager at a directoryshow_in_file_manager('/home/user')# Select the user directory in the home foldershow_in_file_manager('/home/user',open_not_select_directory=False)Open the system home directory (/homeon Linux,/Userson macOS) and
select the user's home folder in it:showinfilemanager-s~Open the user's home directory directly, without selecting it:showinfilemanager~Select files in two different directories, and open a third directory:showinfilemanagermyfile.txt../anotherfile.txt../../The previous command will open three different instances of the file manager,
because of three different directories (macOS users may need to adjust
finder preferences in order to display multiple finder windows).LimitationsIts behavior in a confined Linux environment like a Flatpak, Snap, or
AppImage is untested.ContributingPlease file issues or pull requests to improve the code. Discuss
improvements in the GitHub discussion section for this project.The initial source of this code is fromRapid Photo Downloader.LicenseMITAuthors@damonlynch