annotate Lib/glob.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents d7aff4423172
children b0935ef48186
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5242
a50df7f3a10a New doc strings.
Guido van Rossum <guido@python.org>
parents: 574
diff changeset
1 """Filename globbing utility."""
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
41050
850c32db27e6 Patch #1001604: glob.glob() now returns unicode filenames if it was
Georg Brandl <georg@python.org>
parents: 37545
diff changeset
3 import sys
570
34a761046dbd Use module 'os'
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
4 import os
41050
850c32db27e6 Patch #1001604: glob.glob() now returns unicode filenames if it was
Georg Brandl <georg@python.org>
parents: 37545
diff changeset
5 import re
41103
5978e07291fe Revert rev. 54198, it's not really backwards compatible.
Georg Brandl <georg@python.org>
parents: 41050
diff changeset
6 import fnmatch
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
77072
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
8 try:
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
9 _unicode = unicode
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
10 except NameError:
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
11 # If Python is built without Unicode support, the unicode type
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
12 # will not exist. Fake one.
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
13 class _unicode(object):
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
14 pass
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
15
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
16 __all__ = ["glob", "iglob"]
570
34a761046dbd Use module 'os'
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
17
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 def glob(pathname):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
19 """Return a list of paths matching a pathname pattern.
5242
a50df7f3a10a New doc strings.
Guido van Rossum <guido@python.org>
parents: 574
diff changeset
20
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
21 The pattern may contain simple shell-style wildcards a la fnmatch.
5242
a50df7f3a10a New doc strings.
Guido van Rossum <guido@python.org>
parents: 574
diff changeset
22
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
23 """
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
24 return list(iglob(pathname))
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
25
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
26 def iglob(pathname):
52900
4acbbb3e65e2 Merged revisions 70866-70868,70870-70871,70893,70896,70902,70905,70907,70912,70915,70927,70933,70940,70944,70954,70963,70998,71056 via svnmerge from
Georg Brandl <georg@python.org>
parents: 41250
diff changeset
27 """Return an iterator which yields the paths matching a pathname pattern.
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
28
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
29 The pattern may contain simple shell-style wildcards a la fnmatch.
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
30
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
31 """
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
32 if not has_magic(pathname):
33332
062177de8685 Patch #941486: add os.path.lexists(). Also fix bug #940578 by using lexists in glob.glob.
Johannes Gijsbers <jlg@dds.nl>
parents: 18040
diff changeset
33 if os.path.lexists(pathname):
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
34 yield pathname
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
35 return
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
36 dirname, basename = os.path.split(pathname)
18040
fb93dfbd8052 Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents: 16072
diff changeset
37 if not dirname:
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
38 for name in glob1(os.curdir, basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
39 yield name
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
40 return
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
41 if has_magic(dirname):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
42 dirs = iglob(dirname)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
43 else:
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
44 dirs = [dirname]
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
45 if has_magic(basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
46 glob_in_dir = glob1
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
47 else:
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
48 glob_in_dir = glob0
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
49 for dirname in dirs:
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
50 for name in glob_in_dir(dirname, basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
51 yield os.path.join(dirname, name)
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
52
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
53 # These 2 helper functions non-recursively glob inside a literal directory.
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
54 # They return a list of basenames. `glob1` accepts a pattern while `glob0`
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
55 # takes a literal basename (so it only has to check for its existence).
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 def glob1(dirname, pattern):
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
58 if not dirname:
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
59 dirname = os.curdir
77072
d7aff4423172 Issue #8767: Restore building with --disable-unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 68255
diff changeset
60 if isinstance(pattern, _unicode) and not isinstance(dirname, unicode):
41250
9d0c05411734 Fix for glob.py if filesystem encoding is None.
Georg Brandl <georg@python.org>
parents: 41050
diff changeset
61 dirname = unicode(dirname, sys.getfilesystemencoding() or
9d0c05411734 Fix for glob.py if filesystem encoding is None.
Georg Brandl <georg@python.org>
parents: 41050
diff changeset
62 sys.getdefaultencoding())
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
63 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
64 names = os.listdir(dirname)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
65 except os.error:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
66 return []
41050
850c32db27e6 Patch #1001604: glob.glob() now returns unicode filenames if it was
Georg Brandl <georg@python.org>
parents: 37545
diff changeset
67 if pattern[0] != '.':
850c32db27e6 Patch #1001604: glob.glob() now returns unicode filenames if it was
Georg Brandl <georg@python.org>
parents: 37545
diff changeset
68 names = filter(lambda x: x[0] != '.', names)
850c32db27e6 Patch #1001604: glob.glob() now returns unicode filenames if it was
Georg Brandl <georg@python.org>
parents: 37545
diff changeset
69 return fnmatch.filter(names, pattern)
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
71 def glob0(dirname, basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
72 if basename == '':
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
73 # `os.path.split()` returns an empty basename for paths ending with a
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
74 # directory separator. 'q*x/' should match only directories.
37545
a8d4928292d8 glob('anything*/') would fail because isdir is in os.path, not os.
Neal Norwitz <nnorwitz@gmail.com>
parents: 34365
diff changeset
75 if os.path.isdir(dirname):
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
76 return [basename]
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
77 else:
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
78 if os.path.lexists(os.path.join(dirname, basename)):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
79 return [basename]
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
80 return []
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
81
574
03b9f152adb6 Never return a non-existing pathname.
Guido van Rossum <guido@python.org>
parents: 570
diff changeset
82
6519
24da035ceb6e Convert all remaining *simple* cases of regex usage to re usage.
Guido van Rossum <guido@python.org>
parents: 5242
diff changeset
83 magic_check = re.compile('[*?[]')
574
03b9f152adb6 Never return a non-existing pathname.
Guido van Rossum <guido@python.org>
parents: 570
diff changeset
84
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 def has_magic(s):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
86 return magic_check.search(s) is not None