FileNotFoundError: [Errno 2] 没有这样的文件或目录 + os.execv

Posted

技术标签:

【中文标题】FileNotFoundError: [Errno 2] 没有这样的文件或目录 + os.execv【英文标题】:FileNotFoundError: [Errno 2] No such file or directory + os.execv 【发布时间】:2019-11-03 00:07:09 【问题描述】:

我正在创建一个包装脚本来执行我的 python 程序。逻辑是这样的:

    我将在 docker 容器中安装所有需要的模块 拉取容器并运行脚本,这样任何人都可以运行我的脚本而不必担心依赖的模块 我创建了一个包装脚本,将调用它来执行所需的程序

这是我的包装脚本:

import os
import sys
import argparse

parse = argparse.ArgumentParser()
parse.add_argument('command', help="give datacenter name")
parse.add_argument('args', nargs=argparse.REMAINDER)
parse_arguments = parse.parse_args()

'''
Co-relate to the command and corresponding scripts to trigger
'''
scripts = 
    'verify' : '/path/verify.py'
    

if __name__ == '__main__':

    if parse_arguments.command not in scripts:
        print('These are the available scripts to run:')
        print('\n'.join(sorted(scripts.keys())))
    else:
        os.execv(scripts.get(parse_arguments.command), 
[scripts.get(parse_arguments.command)] + parse_arguments.args) .   

我正在运行这个,

$ docker run -it --rm --net host run-script verify --listenv tpc1
Traceback (most recent call last):
  File "/path/runme.py", line 28, in <module>
    os.execv(scripts.get(parse_arguments.command), 
[scripts.get(parse_arguments.command)] + parse_arguments.args)
FileNotFoundError: [Errno 2] No such file or directory

我的 Docker 镜像是运行脚本

如果我在本地机器上运行相同的代码,它确实可以工作。但在容器内它显示此文件找不到错误。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

传递给sys.argv 的第一个参数是运行文件的路径,这里是/path/runme.py。从本地计算机运行时会找到该文件,但可能不在 docker 容器中(我不确定为什么)。

在实例化您的 ArgParser 时尝试设置 prog parameter,例如:

parse = argparse.ArgumentParser(prog="run_me.py")

【讨论】:

【参考方案2】:

我设法解决了这个问题。问题主要在于我提供的shebang。因此,当我在 docker 容器中执行脚本时,它会检查是否从 shebang 位置执行代码。 我会说,这是我这边的一个错误,FileNotFoundError 并没有给我关于 shebang 的线索。终于明白了。 @olinox14 - 感谢您的更新,argparse 中的“prog”参数帮助我输出更好的帮助消息,其中包含 docker 容器中的脚本名称,而不是 docker 容器中的完整路径。

【讨论】:

【参考方案3】:

os.execv(program, args) 默认情况下不会根据 PATH 环境变量搜索 program(第一个参数)。 os.execvp 确实如此。

来自os.execv documentation:

os.execv(path, args)

在结尾处包含“p”的变体(execlp()、execlpe()、 execvp() 和 execvpe()) 将使用 PATH 环境变量 找到程序文件。

因此,无论是用户 os.execvp,还是提供要运行到 os.execv 的程序的完整路径。

【讨论】:

以上是关于FileNotFoundError: [Errno 2] 没有这样的文件或目录 + os.execv的主要内容,如果未能解决你的问题,请参考以下文章

您如何解决: FileNotFoundError: [Errno 2] 没有这样的文件或目录:

FileNotFoundError: [Errno 2] 没有这样的文件或目录,复制路径名后

PyInstaller + UI 文件 - FileNotFoundError: [Errno 2] 没有这样的文件或目录:

PyInstaller + UI 文件 - FileNotFoundError: [Errno 2] 没有这样的文件或目录:

FileNotFoundError: [Errno 2] 没有这样的文件或目录 + os.execv

p = open(q,'r') FileNotFoundError: [Errno 2] 没有这样的文件或目录:'m.txt' [重复]