我使用twisted来制作类似于here所示的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'
无效。
答案 0 :(得分:2)
尝试使用curl可执行文件的实际路径。最有可能的不是os.getcwd()
。 /usr/bin
更有可能(或可能是/bin
或/usr/local/bin
或其他一些系统定义的位置。你可以在shell中使用which curl
找到它。
或者,将PATH环境变量添加到spawnProcess
调用 -
reactor.spawnProcess(
curlProcess, 'curl', args, env={b"PATH": os.environ[b"PATH"]})
或者,甚至可能更好,添加整个环境:
reactor.spawnProcess(
curlProcess, 'curl', args, env=os.environ)
PATH
控制系统在尝试执行它们时查找相对路径名称(如“curl”)的位置。如果未设置,则必须指定一个绝对路径才能执行任何操作。
答案 1 :(得分: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)