随分長いこと Python 使ってるのに、調べたことなかった。ま、あれだな。全部自分でインストールしてるとか、あるいは PYTHONPATH の場所を直接覗くのが癖になってるからだな。あ、のでこのネタは、「Python自身に調べさせる」方法ね。
あと、見出しは「part of」になってますが、やりたいのは「使えるモジュール、パッケージを列挙」の方でもあります。
Contents
Python モジュール・パッケージの列挙
ggrks
あぁ、pkgutil があるのか。危うく sys.path 使って自力でやろうとするとこだったわ:
1 >>> import sys
2 >>> sys.path
3 ['', 'C:\\Python27\\lib\\site-packages\\sphinx-1.2.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\jinja2-2.7.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\docutils-0.12-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\markupsafe-0.23-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\xlutils-1.7.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\xlwt-0.7.5-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\feedparser-5.1.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\httplib2-0.9-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\nagaram-0.3.8-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\fuzzy-1.0-py2.7-win-amd64.egg', 'C:\\Python27\\lib\\site-packages\\pygments-2.0.2-py2.7.egg', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin']
4 >>> sorted(filter(lambda s: s, sys.path))
5 ['C:\\Python27', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\Python27\\lib\\site-packages\\docutils-0.12-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\feedparser-5.1.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\fuzzy-1.0-py2.7-win-amd64.egg', 'C:\\Python27\\lib\\site-packages\\httplib2-0.9-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\jinja2-2.7.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\markupsafe-0.23-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\nagaram-0.3.8-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\pygments-2.0.2-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\sphinx-1.2.3-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\xlutils-1.7.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\xlwt-0.7.5-py2.7.egg', 'C:\\Windows\\system32\\python27.zip']
6 >>> sorted(map(lambda s: s.replace("\\", "/"), filter(lambda s: s, sys.path)))
7 ['C:/Python27', 'C:/Python27/DLLs', 'C:/Python27/lib', 'C:/Python27/lib/lib-tk', 'C:/Python27/lib/plat-win', 'C:/Python27/lib/site-packages', 'C:/Python27/lib/site-packages/Pythonwin', 'C:/Python27/lib/site-packages/docutils-0.12-py2.7.egg', 'C:/Python27/lib/site-packages/feedparser-5.1.3-py2.7.egg', 'C:/Python27/lib/site-packages/fuzzy-1.0-py2.7-win-amd64.egg', 'C:/Python27/lib/site-packages/httplib2-0.9-py2.7.egg', 'C:/Python27/lib/site-packages/jinja2-2.7.3-py2.7.egg', 'C:/Python27/lib/site-packages/markupsafe-0.23-py2.7.egg', 'C:/Python27/lib/site-packages/nagaram-0.3.8-py2.7.egg', 'C:/Python27/lib/site-packages/pygments-2.0.2-py2.7.egg', 'C:/Python27/lib/site-packages/sphinx-1.2.3-py2.7.egg', 'C:/Python27/lib/site-packages/win32', 'C:/Python27/lib/site-packages/win32/lib', 'C:/Python27/lib/site-packages/xlutils-1.7.1-py2.7.egg', 'C:/Python27/lib/site-packages/xlwt-0.7.5-py2.7.egg','C:/Windows/system32/python27.zip']
8 >>> print("\n".join(sorted(map(lambda s: s.replace("\\", "/"), filter(lambda s: s, sys.path)))))
9 C:/Python27
10 C:/Python27/DLLs
11 C:/Python27/lib
12 C:/Python27/lib/lib-tk
13 C:/Python27/lib/plat-win
14 C:/Python27/lib/site-packages
15 C:/Python27/lib/site-packages/Pythonwin
16 C:/Python27/lib/site-packages/docutils-0.12-py2.7.egg
17 C:/Python27/lib/site-packages/feedparser-5.1.3-py2.7.egg
18 C:/Python27/lib/site-packages/fuzzy-1.0-py2.7-win-amd64.egg
19 C:/Python27/lib/site-packages/httplib2-0.9-py2.7.egg
20 C:/Python27/lib/site-packages/jinja2-2.7.3-py2.7.egg
21 C:/Python27/lib/site-packages/markupsafe-0.23-py2.7.egg
22 C:/Python27/lib/site-packages/nagaram-0.3.8-py2.7.egg
23 C:/Python27/lib/site-packages/pygments-2.0.2-py2.7.egg
24 C:/Python27/lib/site-packages/sphinx-1.2.3-py2.7.egg
25 C:/Python27/lib/site-packages/win32
26 C:/Python27/lib/site-packages/win32/lib
27 C:/Python27/lib/site-packages/xlutils-1.7.1-py2.7.egg
28 C:/Python27/lib/site-packages/xlwt-0.7.5-py2.7.egg
29 C:/Windows/system32/python27.zip
30 >>>
ここまで出来てればあとはすぐでしょ、って? いや、こっからが大変なのよ。まず基礎的な話。
- モジュール nearly equal ファイル
- パッケージ nearly equal フォルダ
ね、まずは。ですが、パッケージであるためには条件が2つ。「PYTHONPATH(等)によって、インタプリタが検索可能な場所にあること」「(Python 3.2 までは)__init__.pyが含まれること」。モジュールはもちろん「特定の拡張子か(py, pyc, pyo, pyd, so, …etc.)」ね。
この sys.path 列挙は概ね「パッケージ・モジュールがありそうな場所」を列挙してる。また、上の例からわかるように、zip ファイルも含まれる。なお、egg はパッケージのメタ情報を含んだ zip もしくはフォルダ。あぁこいつぁ大変だ、っと。「パッケージであるための条件」も思い出してな。
気を取り直せ – pkgutil 使え
そいでは pkgutil で。
1 >>> import pkgutil
2 >>> help(pkgutil.iter_modules)
3 Help on function iter_modules in module pkgutil:
4
5 iter_modules(path=None, prefix='')
6 Yields (module_loader, name, ispkg) for all submodules on path,
7 or, if path is None, all top-level modules on sys.path.
8
9 'path' should be either None or a list of paths to look for
10 modules in.
11
12 'prefix' is a string to output on the front of every module name
13 on output.
14
15 >>> (modname for importer, modname, ispkg in pkgutil.iter_modules())
16 <generator object <genexpr> at 0x0000000002AC5900>
17 >>> print("\n".join(sorted((modname for importer, modname, ispkg in pkgutil.iter_modules()))))
18 BaseHTTPServer
19 Bastion
20 CGIHTTPServer
21 Canvas
22 ConfigParser
23 Cookie
24 Cython
25 ...(snip)...
26 _LWPCookieJar
27 _MozillaCookieJar
28 __future__
29 _abcoll
30 _bsddb
31 _cffi_backend
32 _ctypes
33 ...(snip)...
34 abc
35 adodbapi
36 afxres
37 aifc
38 ...(snip)...
39 tkColorChooser
40 ...(snip)...
41 zipfile
42 ...(snip)...
43 >>>
トップレベルのモジュールまたはパッケージを全部列挙しとるね? ん? あ、せっかく ispkg もらってるんだから…:
1 >>> print("\n".join(
2 ... sorted(
3 ... ("%s %s" % ("P" if ispkg else " ", modname)
4 ... for importer, modname, ispkg in pkgutil.iter_modules()),
5 ... key=lambda s: s[2:])))
6 BaseHTTPServer
7 Bastion
8 ...(snip)...
9 P Cython
10 Dialog
11 ...(snip)...
12 __future__
13 _abcoll
14 ...(snip)...
15 abc
16 P adodbapi
17 ...(snip)...
18 tkColorChooser
19 tkCommonDialog
20 ...(snip)...
21 zipfile
22 >>>
サブパッケージまで潜りたいなら…
1 >>> help(pkgutil.walk_packages)
2 Help on function walk_packages in module pkgutil:
3
4 walk_packages(path=None, prefix='', onerror=None)
5 Yields (module_loader, name, ispkg) for all modules recursively
6 on path, or, if path is None, all accessible modules.
7
8 'path' should be either None or a list of paths to look for
9 modules in.
10
11 'prefix' is a string to output on the front of every module name
12 on output.
13
14 Note that this function must import all *packages* (NOT all
15 modules!) on the given path, in order to access the __path__
16 attribute to find submodules.
17
18 'onerror' is a function which gets called with one argument (the
19 name of the package which was being imported) if any exception
20 occurs while trying to import a package. If no onerror function is
21 supplied, ImportErrors are caught and ignored, while all other
22 exceptions are propagated, terminating the search.
23
24 Examples:
25
26 # list all modules python can access
27 walk_packages()
28
29 # list all submodules of ctypes
30 walk_packages(ctypes.__path__, ctypes.__name__+'.')
31
32 >>> print("\n".join(
33 ... sorted(
34 ... ("%s %s" % ("P" if ispkg else " ", modname)
35 ... for importer, modname, ispkg in pkgutil.walk_packages()),
36 ... key=lambda s: s[2:])))
37 Traceback (most recent call last):
38 File "<stdin>", line 5, in <module>
39 File "<stdin>", line 3, in <genexpr>
40 File "c:\Python27\lib\pkgutil.py", line 125, in walk_packages
41 for item in walk_packages(path, name+'.', onerror):
42 File "c:\Python27\lib\pkgutil.py", line 125, in walk_packages
43 for item in walk_packages(path, name+'.', onerror):
44 File "c:\Python27\lib\pkgutil.py", line 125, in walk_packages
45 for item in walk_packages(path, name+'.', onerror):
46 File "c:\Python27\lib\pkgutil.py", line 110, in walk_packages
47 __import__(name)
48 File "c:\Python27\lib\site-packages\cryptography\hazmat\backends\commoncrypto\__init__.py", line 7, in <module>
49 from cryptography.hazmat.backends.commoncrypto.backend import backend
50 File "c:\Python27\lib\site-packages\cryptography\hazmat\backends\commoncrypto\backend.py", line 244, in <module>
51 backend = Backend()
52 File "c:\Python27\lib\site-packages\cryptography\hazmat\backends\commoncrypto\backend.py", line 44, in __init__
53 self._binding = Binding()
54 File "c:\Python27\lib\site-packages\cryptography\hazmat\bindings\commoncrypto\binding.py", line 43, in __init__
55 self._ensure_ffi_initialized()
56 File "c:\Python27\lib\site-packages\cryptography\hazmat\bindings\commoncrypto\binding.py", line 55, in _ensure_ffi_initialized
57 modules=cls._modules,
58 File "c:\Python27\lib\site-packages\cryptography\hazmat\bindings\utils.py", line 31, in load_library_for_binding
59 lib = ffi.verifier.load_library()
60 File "c:\Python27\lib\site-packages\cffi\verifier.py", line 96, in load_library
61 self._compile_module()
62 File "c:\Python27\lib\site-packages\cryptography\hazmat\bindings\utils.py", line 127, in _compile_module
63 "Attempted implicit compile of a cffi module. All cffi modules should "
64 RuntimeError: Attempted implicit compile of a cffi module. All cffi modules should be pre-compiled at installation time.
「どこで」エラーになるかは貴方が持ってる環境次第なんだけど、ともかく pkgutil.walk_packages は実際にインポートを試みて、エラーになったらその場で処理をやめてしまう…、ので気を取り直して:
1 >>> print("\n".join(
2 ... sorted(
3 ... ("%s %s" % ("P" if ispkg else " ", modname)
4 ... for importer, modname, ispkg in pkgutil.walk_packages(onerror=lambda x: None)),
5 ... key=lambda s: s[2:])))
6 ...(snip)...
7 win32clipboard
8 P win32com
9 P win32com.adsi
10 win32com.adsi.adsi
11 win32com.adsi.adsicon
12 P win32com.authorization
13 win32com.authorization.authorization
14 P win32com.axcontrol
15 win32com.axcontrol.axcontrol
16 P win32com.axdebug
17 win32com.axdebug.adb
18 win32com.axdebug.axdebug
19 win32com.axdebug.codecontainer
20 ...(snip)...
21 >>>
アタシの環境には numpy インストールしてあるので、numpy 内を知りたい、とする。これには path 引数を使ってコントロールするんだけれど、まさか sys.path てことはなくて、これ:
1 >>> import numpy
2 >>> _pkg = numpy
3 >>> _pkg.__path__
4 ['c:\\Python27\\lib\\site-packages\\numpy']
5 >>>
ので:
1 >>> print("\n".join(
2 ... sorted(
3 ... ("%s %s" % ("P" if ispkg else " ", modname)
4 ... for importer, modname, ispkg in pkgutil.walk_packages(
5 ... path=_pkg.__path__,
6 ... onerror=lambda x: None)),
7 ... key=lambda s: s[2:])))
8 __config__
9 _import_tools
10 add_newdocs
11 P compat
12 P core
13 ctypeslib
14 P distutils
15 distutils.archive_util
16 distutils.bcppcompiler
17 distutils.ccompiler
18 distutils.cmd
19 P distutils.command
20 distutils.command.bdist
21 distutils.command.bdist_dumb
22 distutils.command.bdist_msi
23 distutils.command.bdist_rpm
24 distutils.command.bdist_wininst
25 distutils.command.build
26 distutils.command.build_clib
27 distutils.command.build_ext
28 distutils.command.build_py
29 distutils.command.build_scripts
30 distutils.command.check
31 distutils.command.clean
32 distutils.command.config
33 distutils.command.install
34 distutils.command.install_data
35 distutils.command.install_egg_info
36 distutils.command.install_headers
37 distutils.command.install_lib
38 distutils.command.install_scripts
39 distutils.command.register
40 distutils.command.sdist
41 distutils.command.upload
42 distutils.config
43 distutils.core
44 distutils.cygwinccompiler
45 distutils.debug
46 distutils.dep_util
47 distutils.dir_util
48 distutils.dist
49 distutils.emxccompiler
50 distutils.errors
51 distutils.extension
52 distutils.fancy_getopt
53 distutils.file_util
54 distutils.filelist
55 distutils.log
56 distutils.msvc9compiler
57 distutils.msvccompiler
58 distutils.spawn
59 distutils.sysconfig
60 P distutils.tests
61 distutils.tests.setuptools_build_ext
62 distutils.tests.setuptools_extension
63 distutils.tests.support
64 distutils.tests.test_archive_util
65 distutils.tests.test_bdist
66 distutils.tests.test_bdist_dumb
67 distutils.tests.test_bdist_msi
68 distutils.tests.test_bdist_rpm
69 distutils.tests.test_bdist_wininst
70 distutils.tests.test_build
71 distutils.tests.test_build_clib
72 distutils.tests.test_build_ext
73 distutils.tests.test_build_py
74 distutils.tests.test_build_scripts
75 distutils.tests.test_ccompiler
76 distutils.tests.test_check
77 distutils.tests.test_clean
78 distutils.tests.test_cmd
79 distutils.tests.test_config
80 distutils.tests.test_config_cmd
81 distutils.tests.test_core
82 distutils.tests.test_dep_util
83 distutils.tests.test_dir_util
84 distutils.tests.test_dist
85 distutils.tests.test_file_util
86 distutils.tests.test_filelist
87 distutils.tests.test_install
88 distutils.tests.test_install_data
89 distutils.tests.test_install_headers
90 distutils.tests.test_install_lib
91 distutils.tests.test_install_scripts
92 distutils.tests.test_msvc9compiler
93 distutils.tests.test_register
94 distutils.tests.test_sdist
95 distutils.tests.test_spawn
96 distutils.tests.test_sysconfig
97 distutils.tests.test_text_file
98 distutils.tests.test_unixccompiler
99 distutils.tests.test_upload
100 distutils.tests.test_util
101 distutils.tests.test_version
102 distutils.tests.test_versionpredicate
103 distutils.text_file
104 distutils.unixccompiler
105 distutils.util
106 distutils.version
107 distutils.versionpredicate
108 P doc
109 dual
110 P f2py
111 P fft
112 P lib
113 P linalg
114 P ma
115 matlib
116 P matrixlib
117 P polynomial
118 P random
119 setup
120 P testing
121 version
122 >>>
そ、numpy は「大規模なパッケージ」なのよ。それより、numpy 配下の名前なのが気に喰わん、…っと:
1 >>> _pkg.__name__
2 'numpy'
3 >>> print("\n".join(
4 ... sorted(
5 ... ("%s %s" % ("P" if ispkg else " ", modname)
6 ... for importer, modname, ispkg in pkgutil.walk_packages(
7 ... path=_pkg.__path__,
8 ... prefix=_pkg.__name__ + ".",
9 ... onerror=lambda x: None)),
10 ... key=lambda s: s[2:])))
11 numpy.__config__
12 numpy._import_tools
13 numpy.add_newdocs
14 P numpy.compat
15 numpy.compat._inspect
16 numpy.compat.py3k
17 numpy.compat.setup
18 P numpy.core
19 numpy.core._dotblas
20 numpy.core._dummy
21 numpy.core._internal
22 numpy.core._methods
23 numpy.core.arrayprint
24 numpy.core.cversions
25 numpy.core.defchararray
26 numpy.core.fromnumeric
27 numpy.core.function_base
28 numpy.core.generate_numpy_api
29 numpy.core.getlimits
30 numpy.core.info
31 numpy.core.machar
32 numpy.core.memmap
33 numpy.core.multiarray
34 numpy.core.multiarray_tests
35 numpy.core.numeric
36 numpy.core.numerictypes
37 numpy.core.operand_flag_tests
38 numpy.core.records
39 numpy.core.scalarmath
40 numpy.core.setup
41 numpy.core.setup_common
42 numpy.core.shape_base
43 numpy.core.struct_ufunc_test
44 numpy.core.test_rational
45 numpy.core.umath
46 numpy.core.umath_tests
47 numpy.ctypeslib
48 P numpy.distutils
49 numpy.distutils.__config__
50 numpy.distutils.__version__
51 numpy.distutils.ccompiler
52 P numpy.distutils.command
53 numpy.distutils.command.autodist
54 numpy.distutils.command.bdist_rpm
55 numpy.distutils.command.build
56 numpy.distutils.command.build_clib
57 numpy.distutils.command.build_ext
58 numpy.distutils.command.build_py
59 numpy.distutils.command.build_scripts
60 numpy.distutils.command.build_src
61 numpy.distutils.command.config
62 numpy.distutils.command.config_compiler
63 numpy.distutils.command.develop
64 numpy.distutils.command.egg_info
65 numpy.distutils.command.install
66 numpy.distutils.command.install_clib
67 numpy.distutils.command.install_data
68 numpy.distutils.command.install_headers
69 numpy.distutils.command.sdist
70 numpy.distutils.compat
71 numpy.distutils.conv_template
72 numpy.distutils.core
73 numpy.distutils.cpuinfo
74 numpy.distutils.environment
75 numpy.distutils.exec_command
76 numpy.distutils.extension
77 P numpy.distutils.fcompiler
78 numpy.distutils.fcompiler.absoft
79 numpy.distutils.fcompiler.compaq
80 numpy.distutils.fcompiler.g95
81 numpy.distutils.fcompiler.gnu
82 numpy.distutils.fcompiler.hpux
83 numpy.distutils.fcompiler.ibm
84 numpy.distutils.fcompiler.intel
85 numpy.distutils.fcompiler.lahey
86 numpy.distutils.fcompiler.mips
87 numpy.distutils.fcompiler.nag
88 numpy.distutils.fcompiler.none
89 numpy.distutils.fcompiler.pathf95
90 numpy.distutils.fcompiler.pg
91 numpy.distutils.fcompiler.sun
92 numpy.distutils.fcompiler.vast
93 numpy.distutils.from_template
94 numpy.distutils.info
95 numpy.distutils.intelccompiler
96 numpy.distutils.lib2def
97 numpy.distutils.line_endings
98 numpy.distutils.log
99 numpy.distutils.mingw32ccompiler
100 numpy.distutils.misc_util
101 numpy.distutils.npy_pkg_config
102 numpy.distutils.numpy_distribution
103 numpy.distutils.pathccompiler
104 numpy.distutils.setup
105 numpy.distutils.system_info
106 numpy.distutils.unixccompiler
107 P numpy.doc
108 numpy.doc.basics
109 numpy.doc.broadcasting
110 numpy.doc.byteswapping
111 numpy.doc.constants
112 numpy.doc.creation
113 numpy.doc.glossary
114 numpy.doc.howtofind
115 numpy.doc.indexing
116 numpy.doc.internals
117 numpy.doc.io
118 numpy.doc.jargon
119 numpy.doc.methods_vs_functions
120 numpy.doc.misc
121 numpy.doc.performance
122 numpy.doc.structured_arrays
123 numpy.doc.subclassing
124 numpy.doc.ufuncs
125 numpy.dual
126 P numpy.f2py
127 numpy.f2py.__version__
128 numpy.f2py.auxfuncs
129 numpy.f2py.capi_maps
130 numpy.f2py.cb_rules
131 numpy.f2py.cfuncs
132 numpy.f2py.common_rules
133 numpy.f2py.crackfortran
134 numpy.f2py.diagnose
135 numpy.f2py.f2py2e
136 numpy.f2py.f2py_testing
137 numpy.f2py.f90mod_rules
138 numpy.f2py.func2subr
139 numpy.f2py.info
140 numpy.f2py.rules
141 numpy.f2py.setup
142 numpy.f2py.use_rules
143 P numpy.fft
144 numpy.fft.fftpack
145 numpy.fft.fftpack_lite
146 numpy.fft.helper
147 numpy.fft.info
148 numpy.fft.setup
149 P numpy.lib
150 numpy.lib._compiled_base
151 numpy.lib._datasource
152 numpy.lib._iotools
153 numpy.lib._version
154 numpy.lib.arraypad
155 numpy.lib.arraysetops
156 numpy.lib.arrayterator
157 numpy.lib.financial
158 numpy.lib.format
159 numpy.lib.function_base
160 numpy.lib.index_tricks
161 numpy.lib.info
162 numpy.lib.nanfunctions
163 numpy.lib.npyio
164 numpy.lib.polynomial
165 numpy.lib.recfunctions
166 numpy.lib.scimath
167 numpy.lib.setup
168 numpy.lib.shape_base
169 numpy.lib.stride_tricks
170 numpy.lib.twodim_base
171 numpy.lib.type_check
172 numpy.lib.ufunclike
173 numpy.lib.user_array
174 numpy.lib.utils
175 P numpy.linalg
176 numpy.linalg._umath_linalg
177 numpy.linalg.info
178 numpy.linalg.lapack_lite
179 numpy.linalg.linalg
180 numpy.linalg.setup
181 P numpy.ma
182 numpy.ma.bench
183 numpy.ma.core
184 numpy.ma.extras
185 numpy.ma.mrecords
186 numpy.ma.setup
187 numpy.ma.testutils
188 numpy.ma.timer_comparison
189 numpy.ma.version
190 numpy.matlib
191 P numpy.matrixlib
192 numpy.matrixlib.defmatrix
193 numpy.matrixlib.setup
194 P numpy.polynomial
195 numpy.polynomial._polybase
196 numpy.polynomial.chebyshev
197 numpy.polynomial.hermite
198 numpy.polynomial.hermite_e
199 numpy.polynomial.laguerre
200 numpy.polynomial.legendre
201 numpy.polynomial.polynomial
202 numpy.polynomial.polytemplate
203 numpy.polynomial.polyutils
204 numpy.polynomial.setup
205 P numpy.random
206 numpy.random.info
207 numpy.random.mtrand
208 numpy.random.setup
209 numpy.setup
210 P numpy.testing
211 numpy.testing.decorators
212 numpy.testing.noseclasses
213 numpy.testing.nosetester
214 numpy.testing.print_coercion_tables
215 numpy.testing.setup
216 numpy.testing.utils
217 numpy.version
218 >>>
これでたいがいのことは出来ろ?
ロリポップ! レンタルサーバの Python 環境を知りたくなったのよ
レンタルサーバてのは自分で環境をコントロール出来たり出来なかったりで、今のアタシのばやいは後者に置かれておる。
ときどき検証とか実験とかでWordPress + jquery ajax + Python + json で苦労してみたとかWORDPRESS + JQUERY AJAX + PYTHON + JSON で再度苦労してみたとかみたいに、ロリポップ! レンタルサーバにインストールしてある Python 依存のことを割とやるわけだ。そもそも標準添付ライブラリのみの素の Python なのか、それとも何かパッケージを追加してあるのか。
今の目的の場合は pkgutil.iter_modules の方がいいね。
こんなスクリプトをまずは書いておこう:
1 # -*- coding: utf-8 -*-
2 import pkgutil
3 print("<table>")
4
5 for line in sorted(
6 ("%s %s" % (
7 "P" if ispkg else " ", modname)
8 for importer, modname, ispkg in pkgutil.iter_modules()),
9 key=lambda s: s[2:]):
10
11 print("<tr><td>%s</td><td>%s</td>" % (line[0], line[2:]))
12
13 print("</table>")
Wordpress にペタっと貼り付けたいので html の table を出力するようにしてある。
さて。契約が「チカッパプラン」でない限りは、「telnet的ログイン」(つまり ssh)は使えないので、ここからはちょいと悩ましい。作ったこのスクリプトをどうやって起動し、そして結果をどうやって受け取るか?
これだけのためにWordPress + jquery ajax + Python + json で苦労してみたとかWORDPRESS + JQUERY AJAX + PYTHON + JSON で再度苦労してみたみたいなアプローチを採用するのは馬鹿げてるしな。
で、WEB インターフェイス以外・ssh以外での「シェルを起動する手段」となれば、唯一 cron だけがある。ので、cron に一時的に登録するような手段にしておこう。ので、cron から起動し、特定の場所に結果を書き出すようなスクリプトを書いておく。ロリポップ!には Python 2.5 と Python 2.7 がインストールされているが、さすがに 2.5 には興味ないので、2.7 用に:
1 #! /bin/sh
2 py=/usr/bin/python2.7 # ロリポップ! サーバの Python 2.7 のパス
3 wd=`dirname $0` # ※
4
5 ${py} ${wd}/my_iter_modules.py > ${wd}/my_iter_modules_exec.txt
※は、cron からフルパスで呼ばれることに依存し、また、my_iter_modules.py と同じ場所に my_iter_modules_exec を置くことを期待した記述。
あとはこの2つのファイルをどこかにアップロードし、my_iter_modules_exec は実行権限を付けて cron 設定に書くだけ。
あ、真似したい人はシェルスクリプトの方は文字エンコーディングと改行コードには注意ね。あと作業が終わったらスクリプトはちゃんと消しとこうね。思わぬセキュリティリスクになってはいけませんのでね。
結果は以下の通り:
BaseHTTPServer | |
Bastion | |
CDROM | |
CGIHTTPServer | |
Canvas | |
ConfigParser | |
Cookie | |
DLFCN | |
Dialog | |
DocXMLRPCServer | |
FileDialog | |
FixTk | |
HTMLParser | |
IN | |
MimeWriter | |
P | MySQLdb |
Queue | |
ScrolledText | |
SimpleDialog | |
SimpleHTTPServer | |
SimpleXMLRPCServer | |
SocketServer | |
StringIO | |
TYPES | |
Tix | |
Tkconstants | |
Tkdnd | |
Tkinter | |
UserDict | |
UserList | |
UserString | |
_LWPCookieJar | |
_MozillaCookieJar | |
__future__ | |
_abcoll | |
_bisect | |
_bsddb | |
_codecs_cn | |
_codecs_hk | |
_codecs_iso2022 | |
_codecs_jp | |
_codecs_kr | |
_codecs_tw | |
_collections | |
_csv | |
_ctypes | |
_ctypes_test | |
_curses | |
_curses_panel | |
_elementtree | |
_functools | |
_hashlib | |
_heapq | |
_hotshot | |
_io | |
_json | |
_locale | |
_lsprof | |
_multibytecodec | |
_multiprocessing | |
_mysql | |
_mysql_exceptions | |
_pyio | |
_random | |
_socket | |
_sqlite3 | |
_ssl | |
_strptime | |
_struct | |
_testcapi | |
_threading_local | |
_tkinter | |
_weakrefset | |
abc | |
aifc | |
antigravity | |
anydbm | |
argparse | |
array | |
ast | |
asynchat | |
asyncore | |
atexit | |
audiodev | |
audioop | |
base64 | |
bdb | |
binascii | |
binhex | |
bisect | |
P | bsddb |
bz2 | |
cPickle | |
cProfile | |
cStringIO | |
calendar | |
cgi | |
cgitb | |
chunk | |
cmath | |
cmd | |
code | |
codecs | |
codeop | |
collections | |
colorsys | |
commands | |
compileall | |
P | compiler |
contextlib | |
cookielib | |
copy | |
copy_reg | |
crypt | |
csv | |
P | ctypes |
P | curses |
datetime | |
dbhash | |
dbm | |
decimal | |
difflib | |
dircache | |
dis | |
P | distutils |
dl | |
doctest | |
dumbdbm | |
dummy_thread | |
dummy_threading | |
P | |
P | encodings |
fcntl | |
filecmp | |
fileinput | |
fnmatch | |
formatter | |
fpformat | |
fractions | |
ftplib | |
functools | |
future_builtins | |
gdbm | |
genericpath | |
getopt | |
getpass | |
gettext | |
glob | |
grp | |
gzip | |
hashlib | |
heapq | |
hmac | |
P | hotshot |
htmlentitydefs | |
htmllib | |
httplib | |
P | idlelib |
ihooks | |
imageop | |
imaplib | |
imghdr | |
P | importlib |
imputil | |
inspect | |
io | |
itertools | |
P | json |
keyword | |
P | lib2to3 |
linecache | |
linuxaudiodev | |
locale | |
P | logging |
macpath | |
macurl2path | |
mailbox | |
mailcap | |
markupbase | |
math | |
md5 | |
mhlib | |
mimetools | |
mimetypes | |
mimify | |
mmap | |
modulefinder | |
multifile | |
P | multiprocessing |
mutex | |
netrc | |
new | |
nis | |
nntplib | |
ntpath | |
nturl2path | |
numbers | |
opcode | |
operator | |
optparse | |
os | |
os2emxpath | |
ossaudiodev | |
parser | |
pdb | |
pickle | |
pickletools | |
pipes | |
pkgutil | |
platform | |
plistlib | |
popen2 | |
poplib | |
posixfile | |
posixpath | |
pprint | |
profile | |
pstats | |
pty | |
py_compile | |
pyclbr | |
pydoc | |
P | pydoc_data |
pyexpat | |
quopri | |
random | |
re | |
readline | |
repr | |
resource | |
rexec | |
rfc822 | |
rlcompleter | |
robotparser | |
runpy | |
sched | |
select | |
sets | |
sgmllib | |
sha | |
shelve | |
shlex | |
shutil | |
site | |
smtpd | |
smtplib | |
sndhdr | |
socket | |
spwd | |
P | sqlite3 |
sre | |
sre_compile | |
sre_constants | |
sre_parse | |
ssl | |
stat | |
statvfs | |
string | |
stringold | |
stringprep | |
strop | |
struct | |
subprocess | |
sunau | |
sunaudio | |
symbol | |
symtable | |
sysconfig | |
syslog | |
tabnanny | |
tarfile | |
telnetlib | |
tempfile | |
termios | |
P | test |
textwrap | |
this | |
threading | |
time | |
timeit | |
tkColorChooser | |
tkCommonDialog | |
tkFileDialog | |
tkFont | |
tkMessageBox | |
tkSimpleDialog | |
toaiff | |
token | |
tokenize | |
trace | |
traceback | |
ttk | |
tty | |
turtle | |
types | |
unicodedata | |
P | unittest |
urllib | |
urllib2 | |
urlparse | |
user | |
uu | |
uuid | |
warnings | |
wave | |
weakref | |
webbrowser | |
whichdb | |
P | wsgiref |
xdrlib | |
P | xml |
xmllib | |
xmlrpclib | |
zipfile | |
zlib |
うん、多分追加パッケージなしの素の Python 2.7 だ、これは。(CDROMてのは見覚えないけど。)
2016-08-02追記: カレントディレクトリ除外
最初の投稿時点で気付いていたのかはもはや定かではないのだが、python 起動の方法によってはカレントディレクトリのモジュールまで列挙しちゃう。
これを除外したければ、pkgutil.iter_modules 等使う前に sys.path をごにょごにょしといておくんなはれ。例えば:
1 import pkgutil
2 import sys
3 import os
4
5 try:
6 sys.path.remove(os.path.abspath("."))
7 except ValueError:
8 pass
9 #
10 result = {modname: ispkg
11 for importer, modname, ispkg in pkgutil.iter_modules()}