\section{Standard Module \sectcode{posixpath}}
\label{module-posixpath}
\stmodindex{posixpath}

This module implements some useful functions on POSIX pathnames.

\strong{Do not import this module directly.}  Instead, import the
module \code{os} and use \code{os.path}.
\stmodindex{os}

\renewcommand{\indexsubitem}{(in module posixpath)}

\begin{funcdesc}{basename}{p}
Return the base name of pathname
\var{p}.
This is the second half of the pair returned by
\code{posixpath.split(\var{p})}.
\end{funcdesc}

\begin{funcdesc}{commonprefix}{list}
Return the longest string that is a prefix of all strings in
\var{list}.
If
\var{list}
is empty, return the empty string (\code{''}).
\end{funcdesc}

\begin{funcdesc}{exists}{p}
Return true if
\var{p}
refers to an existing path.
\end{funcdesc}

\begin{funcdesc}{expanduser}{p}
Return the argument with an initial component of \samp{\~} or
\samp{\~\var{user}} replaced by that \var{user}'s home directory.  An
initial \samp{\~{}} is replaced by the environment variable \code{\${}HOME};
an initial \samp{\~\var{user}} is looked up in the password directory through
the built-in module \code{pwd}.  If the expansion fails, or if the
path does not begin with a tilde, the path is returned unchanged.
\end{funcdesc}

\begin{funcdesc}{expandvars}{p}
Return the argument with environment variables expanded.  Substrings
of the form \samp{\$\var{name}} or \samp{\$\{\var{name}\}} are
replaced by the value of environment variable \var{name}.  Malformed
variable names and references to non-existing variables are left
unchanged.
\end{funcdesc}

\begin{funcdesc}{isabs}{p}
Return true if \var{p} is an absolute pathname (begins with a slash).
\end{funcdesc}

\begin{funcdesc}{isfile}{p}
Return true if \var{p} is an existing regular file.  This follows
symbolic links, so both \code{islink()} and \code{isfile()} can be true for the same
path.
\end{funcdesc}

\begin{funcdesc}{isdir}{p}
Return true if \var{p} is an existing directory.  This follows
symbolic links, so both \code{islink()} and \code{isdir()} can be true for the same
path.
\end{funcdesc}

\begin{funcdesc}{islink}{p}
Return true if
\var{p}
refers to a directory entry that is a symbolic link.
Always false if symbolic links are not supported.
\end{funcdesc}

\begin{funcdesc}{ismount}{p}
Return true if pathname \var{p} is a \dfn{mount point}: a point in a
file system where a different file system has been mounted.  The
function checks whether \var{p}'s parent, \file{\var{p}/..}, is on a
different device than \var{p}, or whether \file{\var{p}/..} and
\var{p} point to the same i-node on the same device --- this should
detect mount points for all \UNIX{} and POSIX variants.
\end{funcdesc}

\begin{funcdesc}{join}{p\optional{\, q\optional{\, ...}}}
Joins one or more path components intelligently.  If any component is
an absolute path, all previous components are thrown away, and joining
continues.  The return value is the concatenation of \var{p}, and
optionally \var{q}, etc., with exactly one slash (\code{'/'}) inserted
between components, unless \var{p} is empty.
\end{funcdesc}

\begin{funcdesc}{normcase}{p}
Normalize the case of a pathname.  This returns the path unchanged;
however, a similar function in \code{macpath} converts upper case to
lower case.
\end{funcdesc}

\begin{funcdesc}{samefile}{p\, q}
Return true if both pathname arguments refer to the same file or directory
(as indicated by device number and i-node number).
Raise an exception if a stat call on either pathname fails.
\end{funcdesc}

\begin{funcdesc}{split}{p}
Split the pathname \var{p} in a pair \code{(\var{head}, \var{tail})},
where \var{tail} is the last pathname component and \var{head} is
everything leading up to that.  The \var{tail} part will never contain
a slash; if \var{p} ends in a slash, \var{tail} will be empty.  If
there is no slash in \var{p}, \var{head} will be empty.  If \var{p} is
empty, both \var{head} and \var{tail} are empty.  Trailing slashes are
stripped from \var{head} unless it is the root (one or more slashes
only).  In nearly all cases, \code{join(\var{head}, \var{tail})}
equals \var{p} (the only exception being when there were multiple
slashes separating \var{head} from \var{tail}).
\end{funcdesc}

\begin{funcdesc}{splitext}{p}
Split the pathname \var{p} in a pair \code{(\var{root}, \var{ext})}
such that \code{\var{root} + \var{ext} == \var{p}},
and \var{ext} is empty or begins with a period and contains
at most one period.
\end{funcdesc}

\begin{funcdesc}{walk}{p\, visit\, arg}
Calls the function \var{visit} with arguments
\code{(\var{arg}, \var{dirname}, \var{names})} for each directory in the
directory tree rooted at \var{p} (including \var{p} itself, if it is a
directory).  The argument \var{dirname} specifies the visited directory,
the argument \var{names} lists the files in the directory (gotten from
\code{posix.listdir(\var{dirname})}).
The \var{visit} function may modify \var{names} to
influence the set of directories visited below \var{dirname}, e.g., to
avoid visiting certain parts of the tree.  (The object referred to by
\var{names} must be modified in place, using \code{del} or slice
assignment.)
\end{funcdesc}
