List all the modules that are part of a python package?

随分長いこと Python 使ってるのに、調べたことなかった。ま、あれだな。全部自分でインストールしてるとか、あるいは PYTHONPATH の場所を直接覗くのが癖になってるからだな。あ、のでこのネタは、「Python自身に調べさせる」方法ね。

あと、見出しは「part of」になってますが、やりたいのは「使えるモジュール、パッケージを列挙」の方でもあります。

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 >>> 

ここまで出来てればあとはすぐでしょ、って? いや、こっからが大変なのよ。まず基礎的な話。

  1. モジュール nearly equal ファイル
  2. パッケージ 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 の方がいいね。

こんなスクリプトをまずは書いておこう:

my_iter_modules.py
 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 用に:

my_iter_modules_exec
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 email
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
my_iter_modules
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()}