1

我已经使用twisted 制作了一个类似于此处所示的SSH 服务器。我试图向它添加 curl 功能,如下所示:

class CurlProcessProtocol(protocol.ProcessProtocol):
    def connectionMade(self):
        self.transport.closeStdin()

def do_curl(self, *args):
    "Sets up a download"
    curlProcess = CurlProcessProtocol()
    args = tuple(['curl'])+args
    reactor.spawnProcess(curlProcess, 'curl', args)

我有 curl 在与我的程序相同的目录中运行所需的文件。当我连接到 SSH 服务器并尝试 curl 命令时,我收到以下错误:我之前Error: (2, 'CreateProcess', 'The system cannot find the file specified.')尝试过附加但无济于事。os.getcwd()+'curl'

4

2 回答 2

2

尝试使用 curl 可执行文件的实际路径。很可能不在os.getcwd(). /usr/bin更有可能(或可能/bin/usr/local/bin其他一些系统定义的位置)。您可能可以通过which curl在 shell 中使用来找到它。

或者,将 PATH 环境变量添加到您的spawnProcess调用中 -

reactor.spawnProcess(
    curlProcess, 'curl', args, env={b"PATH": os.environ[b"PATH"]})

或者,可能更好的是,添加您的整个环境:

reactor.spawnProcess(
    curlProcess, 'curl', args, env=os.environ)

PATH控制系统在尝试执行它们时在哪里查找相对路径名称,例如“curl”。如果未设置,则必须指定绝对路径才能执行任何操作。

于 2013-06-14T12:02:25.683 回答
0

好吧,所以我需要更具体一些。这是一个有效的 do_curl。我必须在 getcwd() 之后添加一个“\”,在 curl 之后添加一个“.exe”。

def do_curl(self, *args):
    "Sets up a download"
    curlProcess = CurlProcessProtocol()
    args = tuple([os.getcwd()+'\curl.exe'])+args
    reactor.spawnProcess(curlProcess, os.getcwd()+'\curl.exe', args)
于 2013-06-14T23:06:59.373 回答