質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3018閲覧

Pythonスクリプトで実際に使われているモジュールを調べる

Karasuryu

総合スコア52

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2019/01/18 11:09

編集2019/01/19 20:05

###本題
##実際にスクリプト内で使われることになるモジュールだけをリストアップする方法を知っている方がいれば教えてください。

###発生している問題
PythonのスクリプトをEXE化する際、余計なモジュールを一緒にコンパイルしてしまわないようにするために、使われていないモジュールを調べたいのですが、https://docs.python.jp/3/library/modulefinder.htmlにある使用例の通りにmodulefinderを使ってみてもどうやら使われていないモジュールまでインポートされたものとしてリストアップされています。コードは煩雑なのでアップしませんが、簡単に言えばファイル内の文字列を検索して置換するためのプログラムです。にもかかわらずemailやurllibまでインポートされています。modulefinderのこの方法では目的が果たせませんでした。
ちなみにスクリプト内でインポートしているものは
import sys
import os
import subprocess
import glob
import re
import chardet
import datetime
です。

#modulefinderは以下のように使いました。

####module_finder.py

from

1 2finder = ModuleFinder() 3finder.run_script('a.py') 4 5print('Loaded modules:') 6for name, mod in finder.modules.items(): 7 print('%s: ' % name, end='') 8 print(','.join(list(mod.globalnames.keys())[:3])) 9 10print('-'*50) 11print('Modules not imported:') 12print('\n'.join(finder.badmodules.keys()))

####a.py

import re pass

a.pyはosやsysなど変えてやってみました。

結果は以下のようになります。
import sysのみの場合

Loaded modules: __main__: sys sys: -------------------------------------------------- Modules not imported:

import reのみの場合

Loaded modules: __main__: re re: __doc__,enum,sre_compile enum: sys,MappingProxyType,DynamicClassAttribute sys: types: __doc__,sys,_f functools: __doc__,__all__,reduce _functools: abc: __doc__,WeakSet,abstractmethod _weakrefset: ref,__all__,_IterationGuard _weakref: collections: __doc__,__all__,ABCMeta _collections_abc: __doc__,ABCMeta,abstractmethod operator: __doc__,__all__,_abs builtins: _operator: keyword: __doc__,__all__,kwlist heapq: __doc__,__about__,__all__ _heapq: doctest: __doc__,__docformat__,__all__ __future__: __doc__,all_feature_names,__all__ argparse: __doc__,__version__,__all__ copy: __doc__,types,weakref weakref: __doc__,getweakrefcount,getweakrefs itertools: atexit: gc: copyreg: __doc__,__all__,dispatch_table os: __doc__,abc,sys errno: stat: __doc__,ST_MODE,ST_INO _stat: posixpath: __doc__,curdir,pardir genericpath: __doc__,os,stat nt: ntpath: __doc__,curdir,pardir warnings: __doc__,sys,__all__ _warnings: linecache: __doc__,functools,sys tokenize: __doc__,__author__,__credits__ codecs: __doc__,builtins,sys _codecs: encodings: __doc__,codecs,sys encodings.aliases: __doc__,aliases _bootlocale: __doc__,sys,_locale _locale: locale: __doc__,sys,encodings encodings.mbcs: __doc__,mbcs_encode,mbcs_decode io: __doc__,__author__,__all__ _io: token: __doc__,__all__,ENDMARKER tracemalloc: Sequence,Iterable,total_ordering fnmatch: __doc__,os,posixpath pickle: __doc__,FunctionType,dispatch_table struct: __all__,_clearcache,__doc__ _struct: _compat_pickle: IMPORT_MAPPING,NAME_MAPPING,PYTHON2_EXCEPTIONS _pickle: pprint: __doc__,_collections,re time: _tracemalloc: string: __doc__,__all__,_string _string: subprocess: __doc__,sys,_mswindows signal: _signal,_wraps,_IntEnum _signal: threading: __doc__,_sys,_thread _thread: traceback: __doc__,collections,itertools _collections: _threading_local: __doc__,ref,contextmanager contextlib: __doc__,abc,sys msvcrt: _winapi: select: selectors: __doc__,ABCMeta,abstractmethod math: dummy_threading: __doc__,sys_modules,_dummy_thread _dummy_thread: __doc__,__all__,TIMEOUT_MAX textwrap: __doc__,re,__all__ gettext: __doc__,locale,copy difflib: __doc__,__all__,_nlargest inspect: __doc__,__author__,abc ast: __doc__,parse,_NUM_TYPES _ast: dis: __doc__,sys,types opcode: __doc__,__all__,stack_effect _opcode: collections.abc: __doc__,ABCMeta,abstractmethod importlib: __doc__,__all__,_imp _imp: importlib._bootstrap: __doc__,_bootstrap_external,_wrap importlib._bootstrap_external: __doc__,_CASE_INSENSITIVE_PLATFORMS_STR_KEY,_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY importlib.machinery: __doc__,_imp,ModuleSpec pdb: __doc__,os,re cmd: __doc__,string,sys bdb: __doc__,fnmatch,sys reprlib: __doc__,__all__,builtins code: __doc__,sys,traceback codeop: __doc__,__future__,_features glob: __doc__,os,re shlex: __doc__,os,re pydoc: __doc__,__all__,__author__ importlib.util: __doc__,abc,module_from_spec importlib.abc: __doc__,_bootstrap,_bootstrap_external pkgutil: __doc__,namedtuple,simplegeneric zipimport: marshal: platform: __doc__,__copyright__,__version__ winreg: plistlib: __doc__,__all__,binascii binascii: datetime: __doc__,_time,_math _datetime: _strptime: __doc__,time,locale calendar: __doc__,sys,datetime xml: __doc__,__all__ xml.parsers: __doc__ xml.parsers.expat: __doc__,sys pyexpat: socket: __doc__,_socket,os _socket: urllib: urllib.parse: __doc__,re,sys tempfile: __doc__,__all__,_functools shutil: __doc__,os,sys zlib: bz2: __doc__,__all__,__author__ _compression: __doc__,io,BUFFER_SIZE _bz2: lzma: __doc__,__all__,builtins _lzma: tarfile: __doc__,version,__author__ gzip: __doc__,struct,sys zipfile: __doc__,io,os py_compile: __doc__,importlib,os random: __doc__,_warn,_MethodType hashlib: __doc__,__always_supported,algorithms_guaranteed _hashlib: logging: __doc__,sys,os _sha1: _md5: _sha256: _sha512: _blake2: _sha3: bisect: __doc__,insort_right,insort _bisect: _random: tty: __doc__,__all__,IFLAG pydoc_data: pydoc_data.topics: topics http: IntEnum,__all__,HTTPStatus http.server: __doc__,__version__,__all__ email: __doc__,__all__,message_from_string email.parser: __doc__,__all__,StringIO email.feedparser: __doc__,__all__,re email.errors: __doc__,MessageError,MessageParseError email._policybase: __doc__,abc,header email.header: __doc__,__all__,re email.quoprimime: __doc__,__all__,re email.base64mime: __doc__,__all__,b64encode base64: __doc__,re,struct getopt: __doc__,__all__,os email.charset: __all__,partial,email email.encoders: __doc__,__all__,_bencode quopri: __doc__,__all__,ESCAPE email.utils: __doc__,__all__,os email._parseaddr: __doc__,__all__,time email.message: __doc__,__all__,re uu: __doc__,binascii,os optparse: __doc__,__version__,__all__ email._encoded_words: __doc__,re,base64 email.iterators: __doc__,__all__,sys email.generator: __doc__,__all__,re email.policy: __doc__,re,Policy email.headerregistry: __doc__,MappingProxyType,utils email._header_value_parser: __doc__,re,urllib email.contentmanager: binascii,email,quoprimime html: __doc__,_re,_html5 html.entities: __doc__,__all__,name2codepoint http.client: __doc__,email,http ssl: __doc__,ipaddress,textwrap ipaddress: __doc__,__version__,functools _ssl: mimetypes: __doc__,os,sys socketserver: __doc__,__version__,socket webbrowser: __doc__,os,shlex unittest: __doc__,__all__,__unittest unittest.result: __doc__,io,sys unittest.util: __doc__,namedtuple,OrderedDict unittest.case: __doc__,sys,functools unittest.suite: __doc__,sys,case unittest.loader: __doc__,os,re unittest.main: __doc__,sys,argparse unittest.runner: __doc__,sys,time unittest.signals: signal,weakref,wraps sre_compile: __doc__,_sre,sre_parse _sre: sre_parse: __doc__,MAGIC,MAXREPEAT sre_constants: __doc__,MAGIC,MAXREPEAT -------------------------------------------------- Modules not imported: org.python.core posix pwd collections.Sequence collections.Iterable os.path collections.ChainMap collections.deque _posixsubprocess collections.namedtuple collections.Mapping _dummy_threading _frozen_importlib _frozen_importlib_external collections.OrderedDict readline _winreg java.lang vms_lib grp termios http.HTTPStatus

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/01/18 11:13 編集

使っているライブラリの依存で引っ掛かっているのでは? だとするとかなり難しいはずです(直接それに依存するコードを使っていなくても)
Karasuryu

2019/01/18 11:15

そうだと思います。やはりかなり難しいのですか。
guest

回答1

0

ベストアンサー

emailやurllibに関してはchardetが怪しいかと思ったんですが、以下のコマンドを実行してもemailやurllibは見つからないので、多分もっと他のところで依存してしまっているんじゃないかと思います。例えばsetup.pyによく書くsetuptoolsとか。

python -c "import sys, os, subprocess, glob, re, chardet, datetime; print(*sorted(sys.modules.keys()), sep='\n')"

投稿2019/01/18 12:04

YouheiSakurai

総合スコア6147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karasuryu

2019/01/18 15:14

sys.modulesにもmodulefinderにも詳しくないので何とも言い難いですが、実際にEXE化したファイルを再度展開して中身を見てみるとやはりemailやurllibが入っていることがわかります。 また、試しに上記のライブラリのうちどれかひとつだけをimportするスクリプトを作ってまたmodulefinderで試してみたのですが、不思議なことにsys以外のライブラリをimportした場合はどれもemailやurllibが含まれていました。一般的なモジュールは基本的にemailやurllibをimportするようになっているのでしょうか。
YouheiSakurai

2019/01/18 15:24

「一般的なモジュールは基本的にemailやurllibをimportするようになっているのでしょうか。」->そんな事はないです。sys.modulesはローダがロードしたモジュールが全部詰まっているdictなので、何がロードされたか見るには通常はここを見ます。emailやurllibをインポートしているヤツが必ず何処かにいるはずです。
Karasuryu

2019/01/18 16:08

自分のPCの環境が悪いのかと思って試しにほとんどいじっていない他のWindows端末やUbuntu端末でも同様のことを試してみた結果、sys以外のos, re, glob, chardet等のモジュールをインポートした場合にはemail, urllibなどが含まれていました。謎です。
YouheiSakurai

2019/01/19 09:21

環境の問題でないならば、その「同様のこと」と私の回答の「差」の部分に問題があるんだと思います。その「同様のこと」を他人でも再現できるように詳しく説明することは出来ますか?
Karasuryu

2019/01/19 20:07

他人でも再現できるようにコードを追記しました。
Karasuryu

2019/01/19 20:11

あと、EXE化したファイルを展開したことについてですが、sysしかインポートしなかった場合でもデフォルトでは同様に大量のライブラリが含まれていました。これは単にpyinstallerの仕様なのだと思います。
Karasuryu

2019/01/19 20:16 編集

いずれにせよmodulefinderよりはあなたの言うようにsys.modulesを使ってリストアップする方法が良さそうですね。
YouheiSakurai

2019/01/20 04:17

modulefinderを見てみましたけど何をやっているのか正直追っかけるのが難しいです。modulefinderは私のアプローチみたいに結果を見るのではなく、コードを解析してインポートモジュールを列挙するみたいですね。「PythonのスクリプトをEXE化する際、余計なモジュールを一緒にコンパイルしてしまわないようにする」ための参考情報としてはsys.modulesの情報がある程度有用だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問