/bin/sh:第62行:未找到to:命令

vlurs2pr  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(447)

我有一个python代码,在其中调用shell命令。我执行shell命令的代码部分是:

try:
    def parse(text_list):
        text = '\n'.join(text_list)
        cwd = os.getcwd()
        os.chdir("/var/www/html/alenza/hdfs/user/alenza/sree_account/sree_project/src/core/data_analysis/syntaxnet/models/syntaxnet")
        synnet_output = subprocess.check_output(["echo '%s' | syntaxnet/demo.sh 2>/dev/null"%text], shell = True)
        os.chdir(cwd)
        return synnet_output
except Exception as e:
    sys.stdout.write(str(e))

现在,当我用一些示例输入在本地文件上运行这段代码时(我做了 cat /home/sree/example.json | python parse.py )它工作正常,我得到了所需的输出。但我正在尝试用hdfs上的输入运行代码(相同 cat 命令,但输入文件路径来自hdfs),其中包含完全相同类型的json条目,失败时出现错误:

/bin/sh: line 62: to: command not found
list index out of range

我读过关于堆栈溢出的类似问题,解决方法是为正在调用的shell脚本包含shebang行。我有雪邦线 #!/usr/bin/bashdemo.sh 脚本。
也, which bash 给予 /usr/bin/bash .
有人请详细说明。

js4nwp54

js4nwp541#

在我输入的文本字符串中出现了一些特殊字符的问题 demo.sh . 我通过储存 text 并将该文件的内容发送到 demo.sh .
即:

try:
    def parse(text_list):
        text = '\n'.join(text_list)
        cwd = os.getcwd()
        with open('/tmp/data', 'w') as f:
            f.write(text)
        os.chdir("/var/www/html/alenza/hdfs/user/alenza/sree_account/sree_project/src/core/data_analysis/syntaxnet/models/syntaxnet")
        synnet_output = subprocess.check_output(["cat /tmp/data | syntaxnet/demo.sh 2>/dev/null"%text], shell = True)
        os.chdir(cwd)
        return synnet_output
except Exception as e:
    sys.stdout.write(str(e))
1qczuiv0

1qczuiv02#

您很少(如果有的话)希望将传递列表参数与 shell=True . 只需传递字符串:

synnet_output = subprocess.check_output("echo '%s' | syntaxnet/demo.sh 2>/dev/null"%(text,), shell=True)

但是,这里并不真正需要shell管道。

from subprocess import check_output
from StringIO import StringIO  # from io import StringIO in Python 3
synnet_output = check_output(["syntaxnet/demo.sh"],
                             stdin=StringIO(text),
                             stderr=os.devnull)

相关问题