\section{Standard Module \module{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 \module{os} and use \code{os.path}.
\refstmodindex{os}


\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 \module{pwd}\refbimodindex{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 \function{islink()} and \function{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 \function{islink()} and \function{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.  On \UNIX{}, this returns the path
unchanged; on case-insensitive filesystems, it converts the path to
lowercase.  On Windows, it also converts forward slashes to backward
slashes.
\end{funcdesc}

\begin{funcdesc}{normpath}{p}
Normalize a pathname.  This collapses redundant separators and
up-level references, e.g. \code{A//B}, \code{A/./B} and
\code{A/foo/../B} all become \code{A/B}.  It does not normalize the
case (use \function{normcase()} for that).  On Windows, it does
converts forward slashes to backward slashes.
\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 \function{os.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{os.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 \keyword{del} or slice
assignment.)
\end{funcdesc}
