Python3: command not found, when 运行 from cli

Python3: command not found, when running from cli

我正在尝试 运行 我的 python 模块作为命令,但是我总是收到错误消息:command not found.

#!/usr/bin/env python

import sys
import re
from sys import stdin
from sys import stdout

class Grepper(object):
    def __init__(self, pattern):
        self.pattern = pattern

    def pgreper(self):
        y = (str(self.pattern))
        for line in sys.stdin:
            regex = re.compile(y)
            x = re.search(regex, line)
            if x:
                sys.stdout.write(line)


if __name__ == "__main__":
    print("hello")
    pattern = str(sys.argv[1])
    Grepper(pattern).pgreper()
else:
    print("nope")

我确定它是否与以下行有关:

if __name__ == "__main__":

然而我就是想不通,这对我来说是一个新领域,有点压力。

确保你有可执行文件:/usr/bin/env.

当您尝试 运行 您的 python 模块作为命令时,它会将其称为解释器。如果您没有 env 命令,您可能需要将其替换为 /usr/bin/python/usr/bin/python3

此外,请确保您的文件是可执行的:chmod +x my_module.py 并尝试 运行 它 ./my_module.py

您的脚本名称应该有一个 .py 扩展名,因此它应该被命名为类似于 pgreper.py

要运行它,你需要做python pgreper.py pattern_string或者如果它有可执行权限,正如Gabriel所解释的,你可以做./pgreper.py pattern_string。请注意,您必须 给出脚本路径(除非当前目录在您的命令 PATH 中); pgreper.py pattern_string 将导致 bash 打印 "command not found" 错误消息。

不能通过管道将模式数据传递给它,IOW,cat input.txt | ./pgreper.py "pattern_string"不会工作:模式必须是在命令行上作为参数传递。我猜你 可以 ./pgreper.py "$(cat input.txt)" 但如果你需要该功能,最好修改脚本以从 stdin 读取。

抱歉,我没有正确阅读您的脚本正文。 :尴尬的: 我现在看到您的 pgreper() 方法从标准输入读取数据。如果上面的段落造成任何混淆,我们深表歉意。


为我之前的失态道歉,这里是你的脚本的一个稍微干净的版本。

#! /usr/bin/env python

import sys
import re

class Grepper(object):
    def __init__(self, pattern):
        self.pattern = pattern

    def pgreper(self):
        regex = re.compile(self.pattern)
        for line in sys.stdin:
            if regex.search(line):
                sys.stdout.write(line)


def main():
    print("hello")
    pattern = sys.argv[1]
    Grepper(pattern).pgreper()


if __name__ == "__main__":
    main()
else:
    print("nope")