<p>您可以包装<code>builtins.__input__</code>以记录导入模块的名称,然后运行(通过<code>exec</code>函数,但我们需要捕获<code>if __name__ == '__main__':</code>块,因此这可能是不可避免的)要监视的代码:</p>
<p><code>loggy.py</code></p>
<pre><code>#!/usr/bin/env python3
import builtins
import sys
if __name__ == '__main__':
builtins.__import_copy__ = builtins.__import__
__libs = set()
def __import_wrap__(*args,**kwargs):
__libs.add(args[0])
return builtins.__import_copy__(*args,**kwargs)
builtins.__import__ = __import_wrap__
sys.argv = sys.argv[1:]
exec(open(sys.argv[0]).read())
print(__libs)
</code></pre>
<p>测试脚本<code>test.py</code></p>
<pre><code>#!/usr/bin/env python3
import re
import sys
if __name__ == '__main__':
x = re.findall(r'all\w*',sys.argv[1])
print(x)
</code></pre>
<p>对我(Python 3.6.9)来说,这似乎可以记录辅助脚本导入的所有模块:</p>
<pre class="lang-none prettyprint-override"><code>mostly@ubuntu:~$ python3 loggy.py test.py "allways misspelling"
['allways']
{'_heapq', 'functools', 'collections.abc', 'operator', 'weakref', 'sys', 'copyreg', '_weakref', 'itertools', '_locale', 'abc', '_collections', 'sre_compile', 'enum', 'sre_parse', '_operator', '_collections_abc', '_bootlocale', '_sre', 'sre_constants', '_thread', 'heapq', 'reprlib', 'keyword', '_functools', 're', 'collections', '_weakrefset', 'builtins', 'types'}
</code></pre>