Процедура формирования переменных окружения Python - это песня акына на английском языке (os.py). Сначала я нашел (и скопировал сюда) все способы работы с переменными окружения Windows, а потом прочитал про то, что вытворяет Python, но начинать читаь лучше с "how sys.path is populated on Windows"... А примеры решений в ссылке "How to add to the pythonpath in windows 7?"
Как сделать так, чтобы не было проблем с запуском программ, импортом модулей (Anaconda, дополнительных, таких, как scrapy в мои пакеты которые я устанавливаю в других папках компьютера... Например, как работать с сайтами Django? Самый простой вариант - создать переменную PYTHONPATH, а в ней через точку с запятой перечислить все "нужные пути" пути. Это аналог переменной PATH в Windows. Python формирует переменные окружения для каждого скрипта. Он ищет модули в локальной папке (откуда запущен скрипт), среди глобальных переменных path, pythonpath (в Windows регистр не важен, потому можно маленькими буквами) и формирует пути поиска модулей, их можно посмотреть при помощи команды sys.path. Очередность обхода папок windows зависит от нескольких параметров. Как и каких? Не знаю, но при случае разберусь, поскольку ниже собрал все необходимое для этого.
На изучение мануалов (три ссылки внизу) я вчера угрохал пол-дня. А первые пол-дня ушли на экзерсисы с мануалом Django ... Там есть важное замечание о том, что в Linux нужно использовать symlinks django-admin.py and manage.py, дабы избежать мучений с путями...
Первоисточники и ссылки¶
Переменная среды Windows
Using Python on Windows - finding-modules
How to add to the pythonpath in windows 7?
Using Python on Windows - finding-modules
How to add to the pythonpath in windows 7?
При формировании переменных окружения Python¶
Python usually stores its library (and thereby your site-packages folder) in the installation directory. So, if you had installed Python to **C:**, the default library would reside in C: and third-party modules should be stored in **C:-packages**.
This is how sys.path is populated on Windows:¶
An empty entry is added at the start, which corresponds to the current directory.
If the environment variable PYTHONPATH exists, as described in Environment variables, its entries are added next. Note that on Windows, paths in this variable must be separated by semicolons, to distinguish them from the colon used in drive identifiers (C: etc.).
Additional “application paths” can be added in the registry as subkeys of * under both the HKEY_CURRENT_USER** and HKEY_LOCAL_MACHINE hives.
Subkeys which have semicolon-delimited path strings as their default value will cause each path to be added to sys.path. (Note that all known installers only use HKLM, so HKCU is typically empty.)
If the environment variable PYTHONHOME is set, it is assumed as “Python Home”. Otherwise, the path of the main Python executable is used to locate a “landmark file” (Lib.py) to deduce the “Python Home”.
If a Python home is found, the relevant sub-directories added to sys.path (Lib, plat-win, etc) are based on that folder.
Otherwise, the core Python path is constructed from the PythonPath stored in the registry.
If the Python Home cannot be located, no PYTHONPATH is specified in the environment, and no registry entries can be found, a default path with relative entries is used (e.g. .;.-win, etc).
If the environment variable PYTHONPATH exists, as described in Environment variables, its entries are added next. Note that on Windows, paths in this variable must be separated by semicolons, to distinguish them from the colon used in drive identifiers (C: etc.).
Additional “application paths” can be added in the registry as subkeys of * under both the HKEY_CURRENT_USER** and HKEY_LOCAL_MACHINE hives.
Subkeys which have semicolon-delimited path strings as their default value will cause each path to be added to sys.path. (Note that all known installers only use HKLM, so HKCU is typically empty.)
If the environment variable PYTHONHOME is set, it is assumed as “Python Home”. Otherwise, the path of the main Python executable is used to locate a “landmark file” (Lib.py) to deduce the “Python Home”.
If a Python home is found, the relevant sub-directories added to sys.path (Lib, plat-win, etc) are based on that folder.
Otherwise, the core Python path is constructed from the PythonPath stored in the registry.
If the Python Home cannot be located, no PYTHONPATH is specified in the environment, and no registry entries can be found, a default path with relative entries is used (e.g. .;.-win, etc).
The end result of all this is:¶
When running python.exe, or any other .exe in the main Python directory (either an installed version, or directly from the PCbuild directory), the core path is deduced, and the core paths in the registry are ignored.
Other “application paths” in the registry are always read.
When Python is hosted in another .exe (different directory, embedded via COM, etc), the “Python Home” will not be deduced, so the core path from the registry is used.
Other “application paths” in the registry are always read.
If Python can’t find its home and there is no registry (eg, frozen .exe, some very strange installation setup) you get a path with some default, but relative, paths.
Other “application paths” in the registry are always read.
When Python is hosted in another .exe (different directory, embedded via COM, etc), the “Python Home” will not be deduced, so the core path from the registry is used.
Other “application paths” in the registry are always read.
If Python can’t find its home and there is no registry (eg, frozen .exe, some very strange installation setup) you get a path with some default, but relative, paths.
In [10]:
import sys
In [12]:
sys.path
Out[12]:
In [13]:
%load C:\\Users\\kiss\\Anaconda\\Lib\\os.py
In []:
r"""OS routines for Mac, NT, or Posix depending on what system we're on.
This exports:
- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
- os.path is one of the modules posixpath, or ntpath
- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'
- os.curdir is a string representing the current directory ('.' or ':')
- os.pardir is a string representing the parent directory ('..' or '::')
- os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
- os.extsep is the extension separator ('.' or '/')
- os.altsep is the alternate pathname separator (None or '/')
- os.pathsep is the component separator used in $PATH etc
- os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
- os.defpath is the default search path for executables
- os.devnull is the file path of the null device ('/dev/null', etc.)
Programs that import and use 'os' stand a better chance of being
portable between different platforms. Of course, they must then
only use functions that are defined by all platforms (e.g., unlink
and opendir), and leave all pathname manipulation to os.path
(e.g., split and join).
"""
#'
import sys, errno
_names = sys.builtin_module_names
# Note: more names are added to __all__ later.
__all__ = ["altsep", "curdir", "pardir", "sep", "extsep", "pathsep", "linesep",
"defpath", "name", "path", "devnull",
"SEEK_SET", "SEEK_CUR", "SEEK_END"]
def _get_exports_list(module):
try:
return list(module.__all__)
except AttributeError:
return [n for n in dir(module) if n[0] != '_']
if 'posix' in _names:
name = 'posix'
linesep = '\n'
from posix import *
try:
from posix import _exit
except ImportError:
pass
import posixpath as path
import posix
__all__.extend(_get_exports_list(posix))
del posix
elif 'nt' in _names:
name = 'nt'
linesep = '\r\n'
from nt import *
try:
from nt import _exit
except ImportError:
pass
import ntpath as path
import nt
__all__.extend(_get_exports_list(nt))
del nt
elif 'os2' in _names:
name = 'os2'
linesep = '\r\n'
from os2 import *
try:
from os2 import _exit
except ImportError:
pass
if sys.version.find('EMX GCC') == -1:
import ntpath as path
else:
import os2emxpath as path
from _emx_link import link
import os2
__all__.extend(_get_exports_list(os2))
del os2
elif 'ce' in _names:
name = 'ce'
linesep = '\r\n'
from ce import *
try:
from ce import _exit
except ImportError:
pass
# We can use the standard Windows path.
import ntpath as path
import ce
__all__.extend(_get_exports_list(ce))
del ce
elif 'riscos' in _names:
name = 'riscos'
linesep = '\n'
from riscos import *
try:
from riscos import _exit
except ImportError:
pass
import riscospath as path
import riscos
__all__.extend(_get_exports_list(riscos))
del riscos
else:
raise ImportError, 'no os specific module found'
sys.modules['os.path'] = path
from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
devnull)
del _names
# Python uses fixed values for the SEEK_ constants; they are mapped
# to native constants if necessary in posixmodule.c
SEEK_SET = 0
SEEK_CUR = 1
SEEK_END = 2
#'
# Super directory utilities.
# (Inspired by Eric Raymond; the doc strings are mostly his)
def makedirs(name, mode=0777):
"""makedirs(path [, mode=0777])
Super-mkdir; create a leaf directory and all intermediate ones.
Works like mkdir, except that any intermediate path segment (not
just the rightmost) will be created if it does not exist. This is
recursive.
"""
head, tail = path.split(name)
if not tail:
head, tail = path.split(head)
if head and tail and not path.exists(head):
try:
makedirs(head, mode)
except OSError, e:
# be happy if someone already created the path
if e.errno != errno.EEXIST:
raise
if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
return
mkdir(name, mode)
def removedirs(name):
"""removedirs(path)
Super-rmdir; remove a leaf directory and all empty intermediate
ones. Works like rmdir except that, if the leaf directory is
successfully removed, directories corresponding to rightmost path
segments will be pruned away until either the whole path is
consumed or an error occurs. Errors during this latter phase are
ignored -- they generally mean that a directory was not empty.
"""
rmdir(name)
head, tail = path.split(name)
if not tail:
head, tail = path.split(head)
while head and tail:
try:
rmdir(head)
except error:
break
head, tail = path.split(head)
def renames(old, new):
"""renames(old, new)
Super-rename; create directories as necessary and delete any left
empty. Works like rename, except creation of any intermediate
directories needed to make the new pathname good is attempted
first. After the rename, directories corresponding to rightmost
path segments of the old name will be pruned way until either the
whole path is consumed or a nonempty directory is found.
Note: this function can fail with the new directory structure made
if you lack permissions needed to unlink the leaf directory or
file.
"""
head, tail = path.split(new)
if head and tail and not path.exists(head):
makedirs(head)
rename(old, new)
head, tail = path.split(old)
if head and tail:
try:
removedirs(head)
except error:
pass
__all__.extend(["makedirs", "removedirs", "renames"])
def walk(top, topdown=True, onerror=None, followlinks=False):
"""Directory tree generator.
For each directory in the directory tree rooted at top (including top
itself, but excluding '.' and '..'), yields a 3-tuple
dirpath, dirnames, filenames
dirpath is a string, the path to the directory. dirnames is a list of
the names of the subdirectories in dirpath (excluding '.' and '..').
filenames is a list of the names of the non-directory files in dirpath.
Note that the names in the lists are just names, with no path components.
To get a full path (which begins with top) to a file or directory in
dirpath, do os.path.join(dirpath, name).
If optional arg 'topdown' is true or not specified, the triple for a
directory is generated before the triples for any of its subdirectories
(directories are generated top down). If topdown is false, the triple
for a directory is generated after the triples for all of its
subdirectories (directories are generated bottom up).
When topdown is true, the caller can modify the dirnames list in-place
(e.g., via del or slice assignment), and walk will only recurse into the
subdirectories whose names remain in dirnames; this can be used to prune
the search, or to impose a specific order of visiting. Modifying
dirnames when topdown is false is ineffective, since the directories in
dirnames have already been generated by the time dirnames itself is
generated.
By default errors from the os.listdir() call are ignored. If
optional arg 'onerror' is specified, it should be a function; it
will be called with one argument, an os.error instance. It can
report the error to continue with the walk, or raise the exception
to abort the walk. Note that the filename is available as the
filename attribute of the exception object.
By default, os.walk does not follow symbolic links to subdirectories on
systems that support them. In order to get this functionality, set the
optional argument 'followlinks' to true.
Caution: if you pass a relative pathname for top, don't change the
current working directory between resumptions of walk. walk never
changes the current directory, and assumes that the client doesn't
either.
Example:
import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
print root, "consumes",
print sum([getsize(join(root, name)) for name in files]),
print "bytes in", len(files), "non-directory files"
if 'CVS' in dirs:
dirs.remove('CVS') # don't visit CVS directories
"""
islink, join, isdir = path.islink, path.join, path.isdir
# We may not have read permission for top, in which case we can't
# get a list of the files the directory contains. os.path.walk
# always suppressed the exception then, rather than blow up for a
# minor reason when (say) a thousand readable directories are still
# left to visit. That logic is copied here.
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = listdir(top)
except error, err:
if onerror is not None:
onerror(err)
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
new_path = join(top, name)
if followlinks or not islink(new_path):
for x in walk(new_path, topdown, onerror, followlinks):
yield x
if not topdown:
yield top, dirs, nondirs
__all__.append("walk")
# Make sure os.environ exists, at least
try:
environ
except NameError:
environ = {}
def execl(file, *args):
"""execl(file, *args)
Execute the executable file with argument list args, replacing the
current process. """
execv(file, args)
def execle(file, *args):
"""execle(file, *args, env)
Execute the executable file with argument list args and
environment env, replacing the current process. """
env = args[-1]
execve(file, args[:-1], env)
def execlp(file, *args):
"""execlp(file, *args)
Execute the executable file (which is searched for along $PATH)
with argument list args, replacing the current process. """
execvp(file, args)
def execlpe(file, *args):
"""execlpe(file, *args, env)
Execute the executable file (which is searched for along $PATH)
with argument list args and environment env, replacing the current
process. """
env = args[-1]
execvpe(file, args[:-1], env)
def execvp(file, args):
"""execvp(file, args)
Execute the executable file (which is searched for along $PATH)
with argument list args, replacing the current process.
args may be a list or tuple of strings. """
_execvpe(file, args)
def execvpe(file, args, env):
"""execvpe(file, args, env)
Execute the executable file (which is searched for along $PATH)
with argument list args and environment env , replacing the
current process.
args may be a list or tuple of strings. """
_execvpe(file, args, env)
__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
def _execvpe(file, args, env=None):
if env is not None:
func = execve
argrest = (args, env)
else:
func = execv
argrest = (args,)
env = environ
head, tail = path.split(file)
if head:
func(file, *argrest)
return
if 'PATH' in env:
envpath = env['PATH']
else:
envpath = defpath
PATH = envpath.split(pathsep)
saved_exc = None
saved_tb = None
for dir in PATH:
fullname = path.join(dir, file)
try:
func(fullname, *argrest)
except error, e:
tb = sys.exc_info()[2]
if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
and saved_exc is None):
saved_exc = e
saved_tb = tb
if saved_exc:
raise error, saved_exc, saved_tb
raise error, e, tb
# Change environ to automatically call putenv() if it exists
try:
# This will fail if there's no putenv
putenv
except NameError:
pass
else:
import UserDict
# Fake unsetenv() for Windows
# not sure about os2 here but
# I'm guessing they are the same.
if name in ('os2', 'nt'):
def unsetenv(key):
putenv(key, "")
if name == "riscos":
# On RISC OS, all env access goes through getenv and putenv
from riscosenviron import _Environ
elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
# But we store them as upper case
class _Environ(UserDict.IterableUserDict):
def __init__(self, environ):
UserDict.UserDict.__init__(self)
data = self.data
for k, v in environ.items():
data[k.upper()] = v
def __setitem__(self, key, item):
putenv(key, item)
self.data[key.upper()] = item
def __getitem__(self, key):
return self.data[key.upper()]
try:
unsetenv
except NameError:
def __delitem__(self, key):
del self.data[key.upper()]
else:
def __delitem__(self, key):
unsetenv(key)
del self.data[key.upper()]
def clear(self):
for key in self.data.keys():
unsetenv(key)
del self.data[key]
def pop(self, key, *args):
unsetenv(key)
return self.data.pop(key.upper(), *args)
def has_key(self, key):
return key.upper() in self.data
def __contains__(self, key):
return key.upper() in self.data
def get(self, key, failobj=None):
return self.data.get(key.upper(), failobj)
def update(self, dict=None, **kwargs):
if dict:
try:
keys = dict.keys()
except AttributeError:
# List of (key, value)
for k, v in dict:
self[k] = v
else:
# got keys
# cannot use items(), since mappings
# may not have them.
for k in keys:
self[k] = dict[k]
if kwargs:
self.update(kwargs)
def copy(self):
return dict(self)
else: # Where Env Var Names Can Be Mixed Case
class _Environ(UserDict.IterableUserDict):
def __init__(self, environ):
UserDict.UserDict.__init__(self)
self.data = environ
def __setitem__(self, key, item):
putenv(key, item)
self.data[key] = item
def update(self, dict=None, **kwargs):
if dict:
try:
keys = dict.keys()
except AttributeError:
# List of (key, value)
for k, v in dict:
self[k] = v
else:
# got keys
# cannot use items(), since mappings
# may not have them.
for k in keys:
self[k] = dict[k]
if kwargs:
self.update(kwargs)
try:
unsetenv
except NameError:
pass
else:
def __delitem__(self, key):
unsetenv(key)
del self.data[key]
def clear(self):
for key in self.data.keys():
unsetenv(key)
del self.data[key]
def pop(self, key, *args):
unsetenv(key)
return self.data.pop(key, *args)
def copy(self):
return dict(self)
environ = _Environ(environ)
def getenv(key, default=None):
"""Get an environment variable, return None if it doesn't exist.
The optional second argument can specify an alternate default."""
return environ.get(key, default)
__all__.append("getenv")
def _exists(name):
return name in globals()
# Supply spawn*() (probably only for Unix)
if _exists("fork") and not _exists("spawnv") and _exists("execv"):
P_WAIT = 0
P_NOWAIT = P_NOWAITO = 1
# XXX Should we support P_DETACH? I suppose it could fork()**2
# and close the std I/O streams. Also, P_OVERLAY is the same
# as execv*()?
def _spawnvef(mode, file, args, env, func):
# Internal helper; func is the exec*() function to use
pid = fork()
if not pid:
# Child
try:
if env is None:
func(file, args)
else:
func(file, args, env)
except:
_exit(127)
else:
# Parent
if mode == P_NOWAIT:
return pid # Caller is responsible for waiting!
while 1:
wpid, sts = waitpid(pid, 0)
if WIFSTOPPED(sts):
continue
elif WIFSIGNALED(sts):
return -WTERMSIG(sts)
elif WIFEXITED(sts):
return WEXITSTATUS(sts)
else:
raise error, "Not stopped, signaled or exited???"
def spawnv(mode, file, args):
"""spawnv(mode, file, args) -> integer
Execute file with arguments from args in a subprocess.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return _spawnvef(mode, file, args, None, execv)
def spawnve(mode, file, args, env):
"""spawnve(mode, file, args, env) -> integer
Execute file with arguments from args in a subprocess with the
specified environment.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return _spawnvef(mode, file, args, env, execve)
# Note: spawnvp[e] is't currently supported on Windows
def spawnvp(mode, file, args):
"""spawnvp(mode, file, args) -> integer
Execute file (which is looked for along $PATH) with arguments from
args in a subprocess.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return _spawnvef(mode, file, args, None, execvp)
def spawnvpe(mode, file, args, env):
"""spawnvpe(mode, file, args, env) -> integer
Execute file (which is looked for along $PATH) with arguments from
args in a subprocess with the supplied environment.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return _spawnvef(mode, file, args, env, execvpe)
if _exists("spawnv"):
# These aren't supplied by the basic Windows code
# but can be easily implemented in Python
def spawnl(mode, file, *args):
"""spawnl(mode, file, *args) -> integer
Execute file with arguments from args in a subprocess.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return spawnv(mode, file, args)
def spawnle(mode, file, *args):
"""spawnle(mode, file, *args, env) -> integer
Execute file with arguments from args in a subprocess with the
supplied environment.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
env = args[-1]
return spawnve(mode, file, args[:-1], env)
__all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
if _exists("spawnvp"):
# At the moment, Windows doesn't implement spawnvp[e],
# so it won't have spawnlp[e] either.
def spawnlp(mode, file, *args):
"""spawnlp(mode, file, *args) -> integer
Execute file (which is looked for along $PATH) with arguments from
args in a subprocess with the supplied environment.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
return spawnvp(mode, file, args)
def spawnlpe(mode, file, *args):
"""spawnlpe(mode, file, *args, env) -> integer
Execute file (which is looked for along $PATH) with arguments from
args in a subprocess with the supplied environment.
If mode == P_NOWAIT return the pid of the process.
If mode == P_WAIT return the process's exit code if it exits normally;
otherwise return -SIG, where SIG is the signal that killed it. """
env = args[-1]
return spawnvpe(mode, file, args[:-1], env)
__all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
# Supply popen2 etc. (for Unix)
if _exists("fork"):
if not _exists("popen2"):
def popen2(cmd, mode="t", bufsize=-1):
"""Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
may be a sequence, in which case arguments will be passed directly to
the program without shell intervention (as with os.spawnv()). If 'cmd'
is a string it will be passed to the shell (as with os.system()). If
'bufsize' is specified, it sets the buffer size for the I/O pipes. The
file objects (child_stdin, child_stdout) are returned."""
import warnings
msg = "os.popen2 is deprecated. Use the subprocess module."
warnings.warn(msg, DeprecationWarning, stacklevel=2)
import subprocess
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
bufsize=bufsize, stdin=PIPE, stdout=PIPE,
close_fds=True)
return p.stdin, p.stdout
__all__.append("popen2")
if not _exists("popen3"):
def popen3(cmd, mode="t", bufsize=-1):
"""Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
may be a sequence, in which case arguments will be passed directly to
the program without shell intervention (as with os.spawnv()). If 'cmd'
is a string it will be passed to the shell (as with os.system()). If
'bufsize' is specified, it sets the buffer size for the I/O pipes. The
file objects (child_stdin, child_stdout, child_stderr) are returned."""
import warnings
msg = "os.popen3 is deprecated. Use the subprocess module."
warnings.warn(msg, DeprecationWarning, stacklevel=2)
import subprocess
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
bufsize=bufsize, stdin=PIPE, stdout=PIPE,
stderr=PIPE, close_fds=True)
return p.stdin, p.stdout, p.stderr
__all__.append("popen3")
if not _exists("popen4"):
def popen4(cmd, mode="t", bufsize=-1):
"""Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
may be a sequence, in which case arguments will be passed directly to
the program without shell intervention (as with os.spawnv()). If 'cmd'
is a string it will be passed to the shell (as with os.system()). If
'bufsize' is specified, it sets the buffer size for the I/O pipes. The
file objects (child_stdin, child_stdout_stderr) are returned."""
import warnings
msg = "os.popen4 is deprecated. Use the subprocess module."
warnings.warn(msg, DeprecationWarning, stacklevel=2)
import subprocess
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
bufsize=bufsize, stdin=PIPE, stdout=PIPE,
stderr=subprocess.STDOUT, close_fds=True)
return p.stdin, p.stdout
__all__.append("popen4")
import copy_reg as _copy_reg
def _make_stat_result(tup, dict):
return stat_result(tup, dict)
def _pickle_stat_result(sr):
(type, args) = sr.__reduce__()
return (_make_stat_result, args)
try:
_copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
except NameError: # stat_result may not exist
pass
def _make_statvfs_result(tup, dict):
return statvfs_result(tup, dict)
def _pickle_statvfs_result(sr):
(type, args) = sr.__reduce__()
return (_make_statvfs_result, args)
try:
_copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
_make_statvfs_result)
except NameError: # statvfs_result may not exist
pass
Переменная окружения (переменная среды́, англ. environment variable) в Windows используются для хранения текстовых строк пользователя и информации о настройках операционных систем.¶
In [9]:
#Чтобы получить доступ к значению переменной, необходимо поставить знак % перед её названием и после него, например:
!echo %PROCESSOR_ARCHITECTURE%
In []:
#Чтобы установить значение переменной:
SET TEMP=C:\TEMP
Кроме того, с переменными среды можно работать, нажав кнопку «Переменные среды» на вкладке «Дополнительно» в диалоговом окне «Свойства системы» (контекстное меню значка «Мой компьютер» → пункт «Свойства»).
Также необходимо помнить, что, в отличие от UNIX-систем, в DOS и в стандартной командной строке Windows переменные среды не наследуются запускаемыми процессами, а используются совместно. Это позволяет, например, возвращать через них результаты работы программ, но, с другой стороны, создаёт возможность порчи или переполнения. Особенно актуально переполнение для переменной PATH, поскольку она часто дополняется при работе различных скриптов. При возникновении такого переполнения достаточно просто перезапустить интерпретатор командной строки. Интерпретаторы, портированные из UNIX-систем (например, Z-shell), такой проблеме не подвержены.
Получить значение переменной в программном коде можно с помощью метода ExpandEnvironmentStrings COM-объекта WScript.Shell:
Также необходимо помнить, что, в отличие от UNIX-систем, в DOS и в стандартной командной строке Windows переменные среды не наследуются запускаемыми процессами, а используются совместно. Это позволяет, например, возвращать через них результаты работы программ, но, с другой стороны, создаёт возможность порчи или переполнения. Особенно актуально переполнение для переменной PATH, поскольку она часто дополняется при работе различных скриптов. При возникновении такого переполнения достаточно просто перезапустить интерпретатор командной строки. Интерпретаторы, портированные из UNIX-систем (например, Z-shell), такой проблеме не подвержены.
Получить значение переменной в программном коде можно с помощью метода ExpandEnvironmentStrings COM-объекта WScript.Shell:
In []:
WScriptShell = ObjCreate("WScript.Shell")
UserName = WScriptShell.ExpandEnvironmentStrings("%USERNAME%")
Следует учитывать, что набор значений переменных среды получается процессом во время его запуска, все запускаемые им подчиненные процессы получают значения переменных из этого набора, если второй процесс (независимый от первого) изменяет значение переменной среды или создает новую переменную, эти изменения не будут доступны первому процессу.
Значения переменных среды LOGONSERVER, CLIENTNAME, SESSIONNAME, APPDATA, HOMEDRIVE, HOMEPATH устанавливаются при открытии сеанса на основании значений в ветке реестра [HKEY_CURRENT_USEREnvironment].
Значения переменных среды LOGONSERVER, CLIENTNAME, SESSIONNAME, APPDATA, HOMEDRIVE, HOMEPATH устанавливаются при открытии сеанса на основании значений в ветке реестра [HKEY_CURRENT_USEREnvironment].
Воспользуемся справкой консоли Windows¶
In []:
help
help systeminfo
help path
help set
In [1]:
!help
In []:
C:\Users\kiss\Anaconda>help
Для получения сведений об определенной команде наберите HELP <имя команды>
ASSOC Вывод либо изменение сопоставлений по расширениям имен файлов.
ATTRIB Отображение и изменение атрибутов файлов.
BREAK Включение и выключение режима обработки комбинации клавиш CTRL+C.
BCDEDIT Задает свойства в базе данных загрузки для управления начальной
загрузкой.
CACLS Отображение и редактирование списков управления доступом (ACL)
к файлам.
CALL Вызов одного пакетного файла из другого.
CD Вывод имени либо смена текущей папки.
CHCP Вывод либо установка активной кодовой страницы.
CHDIR Вывод имени либо смена текущей папки.
CHKDSK Проверка диска и вывод статистики.
CHKNTFS Отображение или изменение выполнения проверки диска во время
загрузки.
CLS Очистка экрана.
CMD Запуск еще одного интерпретатора командных строк Windows.
COLOR Установка цветов переднего плана и фона, используемых по умолчанию.
COMP Сравнение содержимого двух файлов или двух наборов файлов.
COMPACT Отображение и изменение сжатия файлов в разделах NTFS.
CONVERT Преобразует тома FAT в NTFS. Вы не можете
преобразовать текущий диск.
COPY Копирование одного или нескольких файлов в другое место.
DATE Вывод либо установка текущей даты.
DEL Удаление одного или нескольких файлов.
DIR Вывод списка файлов и подпапок из указанной папки.
DISKCOMP Сравнение содержимого двух гибких дисков.
DISKCOPY Копирование содержимого одного гибкого диска на другой.
DISKPART Отображение и настройка свойств раздела диска.
DOSKEY Редактирование и повторный вызов командных строк; создание
макросов.
DRIVERQUERY Отображение текущего состояния и свойств драйвера устройства.
ECHO Вывод сообщений и переключение режима отображения команд на
экране.
ENDLOCAL Конец локальных изменений среды для пакетного файла.
ERASE Удаление одного или нескольких файлов.
EXIT Завершение работы программы CMD.EXE (интерпретатора командных
строк).
FC Сравнение двух файлов или двух наборов файлов и вывод различий
между ними.
FIND Поиск текстовой строки в одном или нескольких файлах.
FINDSTR Поиск строк в файлах.
FOR Запуск указанной команды для каждого из файлов в наборе.
FORMAT Форматирование диска для работы с Windows.
FSUTIL Отображение и настройка свойств файловой системы.
FTYPE Вывод либо изменение типов файлов, используемых при
сопоставлении по расширениям имен файлов.
GOTO Передача управления в отмеченную строку пакетного файла.
GPRESULT Отображение информации о групповой политике для компьютера или
пользователя.
GRAFTABL Позволяет Windows отображать расширенный набор символов в
графическом режиме.
HELP Выводит справочную информацию о командах Windows.
ICACLS Отображение, изменение, архивация или восстановление
списков ACL для файлов и каталогов.
IF Оператор условного выполнения команд в пакетном файле.
LABEL Создание, изменение и удаление меток тома для дисков.
MD Создание папки.
MKDIR Создание папки.
MKLINK Cоздание символических и жестких ссылок
MODE Конфигурирование системных устройств.
MORE Последовательный вывод данных по частям размером в один экран.
MOVE Перемещение одного или нескольких файлов из одной папки
в другую.
OPENFILES Отображение файлов, открытых на общей папке удаленным
пользователем.
PATH Отображает или устанавливает путь поиска исполняемых файлов.
PAUSE Приостанавливает выполнение пакетного файла и выводит сообщение.
POPD Восстанавливает предыдущее значение активной папки,
сохраненное с помощью команды PUSHD.
PRINT Выводит на печать содержимое текстового файла.
PROMPT Изменяет приглашение в командной строке Windows.
PUSHD Сохраняет значение активной папки и переходит к другой папке.
RD Удаляет папку.
RECOVER Восстанавливает данные, которые можно прочитать, с плохого или
поврежденного диска.
REM Помещает комментарии в пакетные файлы и файл CONFIG.SYS.
REN Переименовывает файлы или папки.
RENAME Переименовывает файлы или папки.
REPLACE Замещает файлы.
RMDIR Удаление папки.
ROBOCOPY Улучшенное средство копирования файлов и деревьев каталогов
SET Показывает, устанавливает и удаляет переменные среды Windows.
SETLOCAL Начинает локализацию изменений среды в пакетном файле.
SC Отображает и настраивает службы (фоновые процессы).
SCHTASKS Выполняет команды и запускает программы по расписанию.
SHIFT Изменение положения (сдвиг) подставляемых параметров для
пакетного файла.
SHUTDOWN Локальное или удаленное выключение компьютера.
SORT Сортировка ввода.
START Выполнение программы или команды в отдельном окне.
SUBST Назначение заданному пути имени диска.
SYSTEMINFO Вывод сведений о системе и конфигурации компьютера.
TASKLIST Отображение всех выполняемых задач, включая службы.
TASKKILL Прекращение или остановка процесса или приложения.
TIME Вывод и установка системного времени.
TITLE Назначение заголовка окна для текущего сеанса интерпретатора
командных строк CMD.EXE.
TREE Графическое отображение структуры каталогов диска или папки.
TYPE Вывод на экран содержимого текстовых файлов.
VER Вывод сведений о версии Windows.
VERIFY Установка режима проверки правильности записи файлов на диск.
VOL Вывод метки и серийного номера тома для диска.
XCOPY Копирование файлов и деревьев каталогов.
WMIC Вывод сведений WMI в интерактивной среде.
Дополнительные сведения о средствах см. в справочнике по командной
строке в справочной системе.
In []:
C:\Users\kiss\Anaconda>help systeminfo
SYSTEMINFO [/S <система> [/U <пользователь> [/P [<пароль>]]]] [/FO формат] [/NH]
Описание:
Отображает сведения о конфигурации операционной системы
локальный или удаленный компьютер, включая уровни пакета обновления.
Список параметров:
/S <система> Подключаемый удаленный компьютер.
/U [<домен>\]<пользователь> Пользовательский контекст, в котором
должна выполняться эта команда.
/P [<пароль>] Пароль для этого пользовательского контекста.
Запрашивает ввод пароля, если он не задан.
/FO <формат> Определяет формат, в котором отображаются
выходные данные.
Допустимые форматы: "TABLE", "LIST", "CSV".
/NH Не отображать заголовки столбцов в
выходных данных.
Допускается для форматов "TABLE" и "CSV".
/? Вывод справки по использованию.
Примеры:
SYSTEMINFO
SYSTEMINFO /?
SYSTEMINFO /S <система>
SYSTEMINFO /S <система> /U user
SYSTEMINFO /S <система> /U <домен>\<пользователь> /P <пароль> /FO TABLE
SYSTEMINFO /S <система> /FO LIST
SYSTEMINFO /S <система> /FO CSV /NH
In []:
C:\Users\kiss\Anaconda>help path
Вывод или задание пути поиска исполняемых файлов.
PATH [[диск:]путь[;...][;%PATH%]
PATH ;
Команда PATH ; очищает путь поиска используемых файлов, ограничив его
текущим каталогом.
Команда PATH без параметров отображает текущий путь поиска.
При включении в командную строку переменной %PATH% прежний путь поиска
добавляется в конец нового.
In []:
C:\Users\kiss\Anaconda>help set
Вывод, задание и удаление переменных среды cmd.exe.
SET [переменная=[строка]]
переменная Имя переменной среды.
строка Строка символов, присваиваемая указанной переменной.
Введите SET без параметров для вывода текущих переменных среды.
Изменение команды SET при включении расширенной обработки команд:
Если при вызове указать только имя переменной без знака равенства и значения,
команда SET выведет значения всех переменных, имя которых начинается
с указанной строки. Например:
SET P
Эта команда выведет значения всех переменных, имена которых начинаются с 'P'.
In []:
Если имя переменной не найдено в текущей среде, при возврате команда SET
установит значение ошибки ERRORLEVEL 1.
Команда SET не допускает использование знака равенства в имени
переменной среды.
Команда SET поддерживает два дополнительных ключа:
SET /A выражение
SET /P variable=[promptString]
Ключ /A указывает, что строка справа от знака равенства является числовым
выражением, значение которого вычисляется. Обработчик выражений очень
прост и поддерживает следующие операции, перечисленные в порядке убывания
приоритета:
() - группировка
! ~ - - унарные операторы
* / % - арифметические операторы
+ - - арифметические операторы
<< >> - двоичный сдвиг
& - двоичное И
^ - двоичное исключающее ИЛИ
| - двоичное ИЛИ
= *= /= %= += -= - присвоение
&= ^= |= <<= >>=
, - разделитель операторов
При использовании любых логических или двоичных операторов необходимо
заключить строку выражения в кавычки. Любые нечисловые строки в выражении
рассматриваются как имена переменных среды, значения которых преобразуются
в числовой вид перед использованием. Если переменная с указанным именем
не определена в системе, вместо нее подставляется нулевое значение. Это
позволяет выполнять арифметические операции со значениями переменных среды,
причем не нужно вводить знаки % для получения значений. Если команда
SET /A вызывается из командной строки, а не из пакетного файла, она выводит
окончательное значение выражения. Слева от любого оператора присваивания
должно стоять имя переменной среды. Числовые значения рассматриваются как
десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел,
и 0 для восьмеричных чисел. Например, числа 0x12,
и 022 обозначают десятичное число 18. Обратите внимание на запись
восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в
восьмеричной системе исчисления цифры 8 и 9 не используются.
Ключ /P позволяет установить значение переменной для входной строки, введенной
пользователем. Показывает указанное приглашение promptString перед чтением
введенной строки. Приглашение promptString может быть пустым.
Подстановка переменной среды может быть расширена следующим образом:
%PATH:str1=str2%
расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в
расширенном результате на "str2". "str2" может быть пустой строкой для
эффективного удаления вхождений "str1" из расширенного вывода. "str1" может
начинаться со звездочки, и в этом случае это будет соответствовать любому
началу расширенного вывода до первого вхождения оставшейся части "str1".
Можно также использовать строки расширения.
%PATH:~10,5%
расширит действие переменной среды PATH, затем использует только 5
символов, которые начинаются с 11-го символа (пропустив 10) расширенного
результата. Если длина не указана, по умолчанию используется оставшееся
значение переменной. Если оба значения (длина и число пропускаемых символов)
отрицательны, следующим используемым значением будет длина значения переменной
среды, добавленной к указанному значению пропуска или указанной длины.
%PATH:~-10%
извлечет последние 10 символов переменной PATH.
%PATH:~0,-2%
извлечет все символы переменной PATH, за исключением 2-х последних.
Наконец, добавлена поддержка связывания времени выполнения для переменных среды
окружения. По умолчанию эта поддержка отключена. Ключ /V командной строки
CMD.EXE позволяет включать и выключать ее. Для вызова справки, наберите CMD /?
Связывание времени выполнения для переменных среды окружения полезно при обходе
ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения
)
Данное сообщение не будет выводиться, т.к. %VAR% в ОБОИХ выражениях IF
подставляется в момент первого использования в первом IF, в том числе и в тело
первого ветвления IF, которое является составным выражением. В IF внутри
составного выражения в действительности сравниваются значения "before" и
"after", что заведомо ложно. Следующий пример демонстрирует подобную ошибку:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
в данном случае список файлов текущей папки никогда не будет построен. Вместо
этого, значением переменной LIST будет имя последнего найденного файла.
И вновь, это случилось потому, что %LIST% подставляется всего один раз -
в момент обработки выражения FOR, когда список еще пуст.
Фактически, приведенный фрагмент эквивалентен следующему примеру:
for %i in (*) do set LIST= %i
в котором имя последнего найденного файла сохраняется в переменной LIST.
Связывание времени выполнения для переменных среды окружения происходит при
использовании специального символа (восклицательного знака), обозначающего
проведение сопоставления во время выполнения. Если включена поддержка
связывания времени выполнения, то для достижения ожидаемых результатов
приведенные выше фрагменты должны быть изменены следующим образом:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
При включенной расширенной обработке команд доступны несколько переменных
среды, которые расширяются, но не отображаются в списке при вызове команды SET.
Значения этих переменных вычисляются динамически каждый раз при их извлечении.
Если пользователь явно задает переменные с одним из этих имен,
то это определение переопределяет соответствующее динамическое определение,
описанное ниже:
%CD% - заменяется строкой текущего каталога.
%DATE% - заменяется текущей датой с форматом команды DATE.
%TIME% - заменяется текущей датой с форматом команды TIME.
%RANDOM% - заменяется случайным десятичным числом в диапазоне от 0 до 32767.
%ERRORLEVEL% - заменяется текущим значением ERRORLEVEL
%CMDEXTVERSION% - заменяется текущим значением версии
расширенной обработки команд.
%CMDCMDLINE% - заменяется исходной командной строкой, которая вызвала
командный процессор.
%HIGHESTNUMANODENUMBER% - заменяется максимальным номером узла NUMA
на этом компьютере.
In [2]:
!set
In [3]:
!path
In []:
PATH=
C:\Users\kiss\Anaconda\lib\site-packages\numpy\core;
C:\Program Files\ImageMagick-6.8.8-Q8;
C:\Program Files (x86)\AMD APP\bin\x86_64;
C:\Program Files (x86)\AMD APP\bin\x86;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\Windows Live\Shared;
C:\Program Files\Java\jdk1.7.0_21\bin;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;
C:\HashiCorp\Vagrant\bin;
C:\Users\kiss\Anaconda\Scripts;
C:\Program Files\cURL\bin;
C:\Program Files (x86)\MiKTeX 2.9\miktex\bin\;
C:\Program Files\HDF_Group\HDF5\1.8.12\bin;
C:\Users\kiss\Anaconda;
C:\Users\kiss\AppData\Local\Pandoc\
Переменные среды пользователя для kiss (верхнее окно в Settings - Control Panel - System - Advanced - Environment... )¶
Проще кликнуть правой кнопкой на нижней панели и далее выбрать в свойствах "advanced..."
In []:
PATH
C:\Users\kiss\Anaconda;C:\Users\kiss\Anaconda\Scripts;C:\Users\kiss\AppData\Local\Pandoc\
In []:
TEMP
%USERPROFILE%\AppData\Local\Temp
In []:
TMP
%USERPROFILE%\AppData\Local\Temp
Системные переменные (нижнее окно в Settings - Control Panel - System - Advanced - Environment... )¶
In []:
AMDAPPSDKROOT
C:\Program Files (x86)\AMD APP\
In []:
ComSpec
%SystemRoot%\system32\cmd.exe
In []:
FP_NO_HOST_CHECK
NO
In []:
JAVA_HOME
C:\Program Files\Java\jdk1.7.0_21
In []:
NUMBER_OF_PROCESSORS
2
In []:
OPENSSL_CONF
C:\OpenSSL-Win64\bin\openssl.cfg
In []:
OS
Windows_NT
In []:
Path
C:\Program Files\ImageMagick-6.8.8-Q8;
C:\Program Files (x86)\AMD APP\bin\x86_64;
C:\Program Files (x86)\AMD APP\bin\x86;
C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\Windows Live\Shared;
C:\Program Files\Java\jdk1.7.0_21\bin;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;
C:\HashiCorp\Vagrant\bin;
C:\Users\kiss\Anaconda\Scripts;
C:\Program Files\cURL\bin;
C:\Program Files (x86)\MiKTeX 2.9\miktex\bin\;
C:\Program Files\HDF_Group\HDF5\1.8.12\bin
In []:
PATHEXT
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
In []:
PROCESSOR_ARCHITECTURE
AMD64
In []:
PROCESSOR_IDENTIFIER
AMD64 Family 20 Model 2 Stepping 0, AuthenticAMD
In []:
PROCESSOR_LEVEL
20
In []:
PROCESSOR_REVISION
0200
In []:
PSModulePath
%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\
In []:
PYTHON
C:\Users\kiss\Anaconda\python.exe
In []:
TEMP
%SystemRoot%\TEMP
In []:
TMP
%SystemRoot%\TEMP
In []:
USERNAME
SYSTEM
In []:
VBOX_INSTALL_PATH
C:\Program Files\Oracle\VirtualBox\
In []:
VS120COMNTOOLS
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
In []:
windir
%SystemRoot%
In [5]:
!%SystemRoot%
In [7]:
!%HOMEPATH%
In [8]:
!%PAGER%
In []:
Посты чуть ниже также могут вас заинтересовать
При чтении мануала http://sphinx-doc.org/extensions.html
ОтветитьУдалитьобнаружил очень полезный пример, в котором как раз предлагался способ "Set Python’s module search path...":
Where to put your own extensions? ()
Extensions local to a project should be put within the project’s directory structure. Set Python’s module search path, sys.path, accordingly so that Sphinx can find them. E.g., if your extension foo.py lies in the exts subdirectory of the project root, put into conf.py:
import sys, os
sys.path.append(os.path.abspath('exts'))
extensions = ['foo']
You can also install extensions anywhere else on sys.path, e.g. in the site-packages directory.
C:\Users\kiss\Documents\sphinx\aksiomatic>set /?
ОтветитьУдалитьВывод, задание и удаление переменных среды cmd.exe.
SET [переменная=[строка]]
переменная Имя переменной среды.
строка Строка символов, присваиваемая указанной переменной.
Введите SET без параметров для вывода текущих переменных среды.
Изменение команды SET при включении расширенной обработки команд:
Если при вызове указать только имя переменной без знака равенства и значения,
команда SET выведет значения всех переменных, имя которых начинается
с указанной строки. Например:
SET P
Эта команда выведет значения всех переменных, имена которых начинаются с 'P'.
Если имя переменной не найдено в текущей среде, при возврате команда SET
установит значение ошибки ERRORLEVEL 1.
Команда SET не допускает использование знака равенства в имени
переменной среды.
Команда SET поддерживает два дополнительных ключа:
SET /A выражение
SET /P variable=[promptString]
Ключ /A указывает, что строка справа от знака равенства является числовым
выражением, значение которого вычисляется. Обработчик выражений очень
прост и поддерживает следующие операции, перечисленные в порядке убывания
приоритета:
() - группировка
! ~ - - унарные операторы
* / % - арифметические операторы
+ - - арифметические операторы
<< >> - двоичный сдвиг
& - двоичное И
^ - двоичное исключающее ИЛИ
| - двоичное ИЛИ
= *= /= %= += -= - присвоение
&= ^= |= <<= >>=
, - разделитель операторов
При использовании любых логических или двоичных операторов необходимо
заключить строку выражения в кавычки. Любые нечисловые строки в выражении
рассматриваются как имена переменных среды, значения которых преобразуются
в числовой вид перед использованием. Если переменная с указанным именем
не определена в системе, вместо нее подставляется нулевое значение. Это
позволяет выполнять арифметические операции со значениями переменных среды,
причем не нужно вводить знаки % для получения значений. Если команда
SET /A вызывается из командной строки, а не из пакетного файла, она выводит
окончательное значение выражения. Слева от любого оператора присваивания
должно стоять имя переменной среды. Числовые значения рассматриваются как
десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел,
и 0 для восьмеричных чисел. Например, числа 0x12,
и 022 обозначают десятичное число 18. Обратите внимание на запись
восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в
восьмеричной системе исчисления цифры 8 и 9 не используются.
Ключ /P позволяет установить значение переменной для входной строки, введенной
пользователем. Показывает указанное приглашение promptString перед чтением
введенной строки. Приглашение promptString может быть пустым.
Подстановка переменной среды может быть расширена следующим образом:
ОтветитьУдалить%PATH:str1=str2%
расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в
расширенном результате на "str2". "str2" может быть пустой строкой для
эффективного удаления вхождений "str1" из расширенного вывода. "str1" может
начинаться со звездочки, и в этом случае это будет соответствовать любому
началу расширенного вывода до первого вхождения оставшейся части "str1".
Можно также использовать строки расширения.
%PATH:~10,5%
расширит действие переменной среды PATH, затем использует только 5
символов, которые начинаются с 11-го символа (пропустив 10) расширенного
результата. Если длина не указана, по умолчанию используется оставшееся
значение переменной. Если оба значения (длина и число пропускаемых символов)
отрицательны, следующим используемым значением будет длина значения переменной
среды, добавленной к указанному значению пропуска или указанной длины.
%PATH:~-10%
извлечет последние 10 символов переменной PATH.
%PATH:~0,-2%
извлечет все символы переменной PATH, за исключением 2-х последних.
Наконец, добавлена поддержка связывания времени выполнения для переменных среды
окружения. По умолчанию эта поддержка отключена. Ключ /V командной строки
CMD.EXE позволяет включать и выключать ее. Для вызова справки, наберите CMD /?
Связывание времени выполнения для переменных среды окружения полезно при обходе
ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения
)
Данное сообщение не будет выводиться, т.к. %VAR% в ОБОИХ выражениях IF
подставляется в момент первого использования в первом IF, в том числе и в тело
первого ветвления IF, которое является составным выражением. В IF внутри
составного выражения в действительности сравниваются значения "before" и
"after", что заведомо ложно. Следующий пример демонстрирует подобную ошибку:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
в данном случае список файлов текущей папки никогда не будет построен. Вместо
этого, значением переменной LIST будет имя последнего найденного файла.
И вновь, это случилось потому, что %LIST% подставляется всего один раз -
в момент обработки выражения FOR, когда список еще пуст.
Фактически, приведенный фрагмент эквивалентен следующему примеру:
for %i in (*) do set LIST= %i
в котором имя последнего найденного файла сохраняется в переменной LIST.
Связывание времени выполнения для переменных среды окружения происходит при
использовании специального символа (восклицательного знака), обозначающего
проведение сопоставления во время выполнения. Если включена поддержка
связывания времени выполнения, то для достижения ожидаемых результатов
приведенные выше фрагменты должны быть изменены следующим образом:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
При включенной расширенной обработке команд доступны несколько переменных
ОтветитьУдалитьсреды, которые расширяются, но не отображаются в списке при вызове команды SET.
Значения этих переменных вычисляются динамически каждый раз при их извлечении.
Если пользователь явно задает переменные с одним из этих имен,
то это определение переопределяет соответствующее динамическое определение,
описанное ниже:
%CD% - заменяется строкой текущего каталога.
%DATE% - заменяется текущей датой с форматом команды DATE.
%TIME% - заменяется текущей датой с форматом команды TIME.
%RANDOM% - заменяется случайным десятичным числом в диапазоне от 0 до 32767.
%ERRORLEVEL% - заменяется текущим значением ERRORLEVEL
%CMDEXTVERSION% - заменяется текущим значением версии
расширенной обработки команд.
%CMDCMDLINE% - заменяется исходной командной строкой, которая вызвала
командный процессор.
%HIGHESTNUMANODENUMBER% - заменяется максимальным номером узла NUMA
на этом компьютере.