擅长:python、mysql、java
<ol>
<li><code>os.environ</code>是全局的。你在修改它,而不是事后再修改它。因此,在对任何函数执行<code>@patch_python_path</code>操作之后,您现在已经对定义的所有其他内容(包括其他模块和顶层脚本)执行了等效操作。在</li>
<li><code>sys.path</code>也是全局的,而且您要修改它而不是恢复它。在</li>
<li>您不应该同时修改<code>PYTHONPATH</code>和{<cd3>}。(尤其是前者,你通常不需要它。)</li>
<li>您将<code>.</code>添加到<code>PYTHONPATH</code>,但是{<cd8>}添加到{<cd3>}。如果您曾经<em>做过</em>都需要修改这两者,那么在<code>os.chdir()</code>之后,一切都将停止工作,这将有效地改变<code>PYTHONPATH</code>,但不会改变{<cd3>}。在</li>
<li>任何包装的函数都将丢失其docstring、名称等;请在<code>wrap</code>函数上使用<code>@functools.wraps</code>。在</li>
</ol>
<p>这些都只是你的实现中的问题,而没有考虑到它是否是一个好主意。在</p>
<p>人们想要这样做的最常见的原因是(a)使pythonx.Y包像pythonv.W一样工作,(b)允许从源代码树导入包,以便与安装后导入包相同,甚至可以从解释器shell导入。前者可能是个坏主意;后者很方便,但还有其他方法可以实现。如果你有一些不同的更高层次的目标,你必须告诉我们这个目标是什么,然后别人才能告诉你这是否是实现它的最佳方法。在</p>