擅长:python、mysql、java
<p>(从评论中填写细节,单独作答)</p>
<p>首先,相对路径(包含斜线的路径)永远不会签入任何路径,无论您做什么。它们仅与<em>当前工作目录</em>相关。如果需要解析相对路径,则必须手动搜索该路径,或者将该路径修改为包含子目录,然后使用命令名,如下面的建议所示。</p>
<p>如果要相对于Python脚本</em>的位置运行程序<em>,请使用<code>__file__</code>,然后从中查找程序的绝对路径,然后使用<code>Popen</code>中的绝对路径。</p>
<p>其次,还有<a href="http://bugs.python.org/issue8557" rel="noreferrer">an issue in the Python bug tracker</a>关于Python如何处理裸命令(没有斜杠)。基本上,在Unix/Mac上,<code>Popen</code>使用<code>os.execvp</code>调用时使用<code>shell=False</code>,这意味着它会像Python启动时那样查看<code>PATH</code><em>的值,任何更改都不会帮助您解决这个问题。另外,在具有<code>shell=False</code>的Windows上,它根本不关注路径,只会查找相对于当前工作目录的路径。</p>
<p>如果您只需要路径计算,而不想通过shell运行命令行,并且是在UNIX上,我建议您使用<code>env</code>,而不是<code>shell=True</code>,如<code>Popen(['/usr/bin/env', 'progtorun', other, args], ...)</code>。这允许您将不同的路径传递给<code>env</code>进程,该进程将使用它来查找程序。它还避免了shell元字符的问题和通过shell传递参数的潜在安全问题。显然,在Windows(几乎是唯一没有<code>/usr/bin/env</code>的平台)上,您需要做一些不同的事情。</p>