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

时间:2019-06-20 07:50:53

标签: python python-3.x docker argparse

我正在创建一个包装器脚本来执行我的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映像是运行脚本

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

有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

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

在初始化ArgParser时尝试设置prog parameter,例如:

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

答案 1 :(得分:0)

我设法解决了这个问题。问题主要在于我提供的shebang。因此,当我在docker容器中执行脚本时,它正在检查从shebang位置执行代码。

我会说,这是我的错误,FileNotFoundError并没有给我提供有关Shebang的线索。最后,弄清楚了。

@ olinox14-感谢您的更新,argparse中的“ prog”参数帮助我在Docker容器中以脚本名称而不是docker容器中的完整路径输出更好的帮助消息。

答案 2 :(得分:0)

os.execv(program, args)默认不会基于PATH环境变量搜索程序(第一个参数)。 os.execvp可以。

来自os.execv documentation

  

os.execv(path, args)

     

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

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