找不到文件或目录错误: [Errno 2] No such file or directory + os.execv

3
我正在创建一个包装脚本来执行我的Python程序。逻辑如下:
  1. 我将在一个Docker容器中安装所有所需的模块
  2. 拉取容器并运行脚本, 这样任何人都可以运行我的脚本而不必担心依赖的模块
  3. 我创建了一个包装脚本,它将被调用来执行所需的程序
这是我的包装脚本:
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镜像是run-script。

如果我从本地机器运行相同的代码,它能够工作。但在容器内部运行时会显示文件未找到错误。

有人能帮我解决这个问题吗?

3个回答

0

os.execv(program, args) 默认情况下不会基于 PATH 环境变量搜索 program(第一个参数)。os.execvp 则会。

os.execv 文档 中可以看到:

os.execv(path, args)

在函数名后面带有“p”的变体(如 execlp()、execlpe()、execvp() 和 execvpe())将使用 PATH 环境变量来查找程序文件。

因此,要么使用 os.execvp,要么为要运行的程序提供完整路径以供 os.execv 使用。


0

我成功解决了这个问题。问题主要出在我提供的shebang上。因此,当我在docker容器中执行脚本时,它会检查是否从shebang位置执行代码。

我想说,这是我的错误,FileNotFoundError没有给我关于shebang的线索。最终,我找到了解决方法。

@olinox14 - 感谢您的更新,argparse中的“prog”参数帮助我输出了一个更好的帮助信息,其中包含了docker容器中脚本名称,而不是docker容器内部的完整路径。


0

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

尝试设置 prog 参数,在实例化 ArgParser 时使用类似以下的内容:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接