<p>实际上,你自己也回答了你的问题:</p>
<blockquote>
<p>Let's say I have imported two modules<br/>
(insert "from xxx import *" here)<br/>
How can I know from which file is each object being imported?</p>
</blockquote>
<p>不使用通配符导入的原因之一正是为了明确名称从何处导入(另一个原因是避免使用一个导入的名称来隐藏以前导入的名称-这往往会以最意想不到的方式破坏代码,有时甚至很难发现)。你知道吗</p>
<p>请注意,在您编辑的问题中:</p>
<pre><code>from module0 import hello_func
from directory.module1 import hello_var
</code></pre>
<p>你已经对名字的来源有了更好的认识。不是确切的文件路径,但至少是包/模块的名称。你知道吗</p>
<p>这也是不应该使用通配符导入的主要原因之一。你知道吗</p>
<p>现在如果你想知道确切的文件路径,你有两种不同的情况。你知道吗</p>
<p>有些对象跟踪它们是在哪里创建的(主要是模块、类、函数等-参见<code>inspect.getfile()</code>支持的类型列表),然后,您已经知道答案了(使用<code>inspect.getfile()</code>xD)。你知道吗</p>
<p>但大多数类型不会(因为没有理由)。在这种情况下,您必须知道它们是从哪个模块导入的,并对模块本身调用<code>inspect.getfile()</code>。在这种情况下,如果使用通配符导入,则必须手动检查从中导入的所有模块,以找出哪个模块定义了此名称。好好享受。特别是如果其中一个模块也使用了通配符导入。。。你知道吗</p>
<blockquote>
<p>one question please: where they does keep traces? and how these traces look like?</p>
</blockquote>
<p>模块将其保存在<code>__file__</code>属性中。函数和类在其<code>__module__</code>属性中保留对其模块名称的引用,从中可以使用它从<code>sys.modules</code>dict(当前进程中已导入的所有模块的缓存)检索模块,dict将为您提供文件。你知道吗</p>
<p>我从来没有必要在这些信息中搜索回溯、帧、代码对象等,所以恐怕你得自己检查;-)</p>