gpt4 book ai didi

python - SSH:在终端中运行的 javac 命令在通过 SSH 执行时不起作用

转载 作者:可可西里 更新时间:2023-11-01 16:31:56 25 4
gpt4 key购买 nike

我正在使用 Python 代码在使用 SSH 的 Linux (Cloudera) 机器上运行 Hadoop 程序。

我在将 java 文件编译为类文件时遇到了一些问题。当我执行命令时:javac -cp/usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* remote_hadoop/javasrc/* 所有文件都编译成功。

当我通过我的 Python SSH 客户端执行相同的命令时,我收到了“无效标志”错误:

spur.results.RunProcessError:返回代码:2输出:b''stderr 输出:b'javac:无效标志:remote_hadoop/javasrc\n用法:javac\nuse -help 以获得可能的选项列表\n'

python 代码:

list_of_commands = ["javac", "-cp", r"/usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/*", input_folder + r"/*"]
print ' '.join(list_of_commands)
self.shell.run(list_of_commands)

命令正确呈现,因为打印的是 javac -cp/usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* remote_hadoop/javasrc/*.

更新:这很奇怪。我可以通过 ssh 一次编译一个文件,但不是全部。似乎 ssh 上的“*”出了点问题。

最佳答案

您传递的是参数列表,而不是命令列表。它甚至不是一个准确的参数列表。

如果您的底层工具需要参数列表,则传递:

['sh', '-c', 'javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/*  remote_hadoop/javasrc/*']

如果它需要一个命令列表:

['javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/*  remote_hadoop/javasrc/*']

如果它期望其他东西——阅读文档并确定那是什么!


请注意,SSH 不提供在运行任意命令时传递文字 argv 数组的方法;相反,它期望——在协议(protocol)级别——一个准备好由远程 shell 解析的字符串。如果您的 self.shell.run 代码在加入给定的参数列表之前执行 shell 引用,那么它会将最后一个参数作为 literal string remote_hadoop/javasrc/* -- 不像 shell 那样将其扩展为文件名列表

使用 sh -c 形式强制远程 shell 在其末端执行扩展,假定内容以尚未执行远程扩展的形式提供给它。

关于python - SSH:在终端中运行的 javac 命令在通过 SSH 执行时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com