子进程 FileNotFoundError

Posted

技术标签:

【中文标题】子进程 FileNotFoundError【英文标题】:subprocess FileNotFoundError 【发布时间】:2021-09-16 13:15:45 【问题描述】:

我正在使用python3 test.py 在 Ubuntu 上运行 python 代码。但是出现以下错误:

File
"/opt/anaconda3/lib/python3.8/site-packages/geowombat/util/web.py",
line 1679, in list_gcp
        proc = subprocess.run(gsutil_str.split(' '),
      File "/opt/anaconda3/lib/python3.8/subprocess.py", line 489, in run
        with Popen(*popenargs, **kwargs) as process:
      File "/opt/anaconda3/lib/python3.8/subprocess.py", line 854, in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
      File "/opt/anaconda3/lib/python3.8/subprocess.py", line 1702, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: 'gsutil'

web.py中导入的子进程好像找不到gsutil调用。

知道如何解决这个问题吗?我对这些完全陌生,任何提示都有帮助!提前致谢!


更多细节:

test.py 可以简化如下:

from geowombat.util import GeoDownloads
path = xx
row = xx
gdl = GeoDownloads()
gdl.list_gcp('l5', f'path:03d/row:03d')

然后我去了errormsg中提到的web.py中的GeoDownloads.list_gcp(),它调用gsutil为subprocess.run(['gsutil', ...])。但是,如果我将 test.py 更改为以下 sn-p 它可以正常工作:

import subprocess
subprocess.run(["gsutil"])

另外,我尝试将 gsutil (/opt/anaconda3/bin/gsutil) 的路径添加到 PATH env,错误将变为“NotADirectoryError: Not a directory: 'gsutil'”。


补充: /opt/anaconda3/bin 已存在于 PATH 环境中。 PATH 如下所示:/opt/anaconda3/bin:/opt/anaconda3/condabin:...

【问题讨论】:

鉴于最后一条错误消息,您可以尝试将/opt/anaconda3/bin 添加到您的PATH 吗? 是的,它已经在 PATH 中 我认为@edemaine 说要在最后删除“gsutil”。您已将程序添加到路径,而不是其父目录。 是的,我就是这么做的。 PATH 类似于:/opt/anaconda3/bin: ... 没有 /opt/anaconda3/bin/gsutil。但是如果我将 /opt/anaconda3/bin/gsutil 添加到 PATH 中,错误将变为最后一个 errormsg。 gsutil 文件的具体内容是什么?如果它存在,我猜它是一个悬空的符号链接,或者是一个需要解释器但找不到的脚本。 (例如,像 #!/misspelled/bin/sh 这样的 shebang 会在某些系统上产生此错误消息。) 【参考方案1】:

好的,非常感谢@edemaine 和@tdelaney。我尝试再次将/opt/anaconda3/bin 添加到PATH,它似乎解决了问题并继续前进。不知道为什么,好像只能解析新添加的PATH

【讨论】:

以上是关于子进程 FileNotFoundError的主要内容,如果未能解决你的问题,请参考以下文章

什么是父进程和子进程?

在子进程运行和通信时终止子进程,这些子进程通过队列干净地通信

【linux c】子进程结束了,父进程还在,用ps -ef查看,子进程变成僵尸进程了。

什么是子进程和父进程

shell向子进程发送信号

如何关闭 Qt 子进程并让子进程执行清理代码?