gpt4 book ai didi

python - Lua脚本不会执行python脚本

转载 作者:行者123 更新时间:2023-12-01 07:43:16 30 4
gpt4 key购买 nike

我有一个 lua 脚本,配置为在主题的元数据发送到特定的在线 Orthanc 服务器时触发。我希望它抓取主题 ID,然后使用该 ID 作为参数调用 python 脚本。当我手动将命令放入终端时,它可以工作,但 lua 脚本似乎没有执行它。

有一个内置的 Orthanc 函数,一旦将主题发送到服务器,就会从主题中抓取 ID。最初的 lua 脚本如下:

path = "/path/to/python_script.py"
os.execute("python " .. path .. " " .. subjectId)

但是脚本没有被调用。

我首先想看看它是否被触发,所以我添加了:

file = io.open("/path/to/textfile.txt", "a")
file:write("\nI am alive, subjectId is " .. subjectId)
file:close()

这成功了!

然后我想看看 os.execute 是否有问题,所以我这样做了:

os.execute("touch /same/path/deleteme.txt")

这也有效。所以看起来 os.execute 不起作用。有谁知道为什么脚本没有被调用?

编辑:有谁知道如何检查 os.execute 命令的状态?编辑:我正在使用 Python 3.5.6、Lua 5.1.4 和 Linux。

最佳答案

首先,解决您关于检查 os.execute 状态的问题:该函数返回 a status code, which is system dependent (https://www.lua.org/manual/5.1/manual.html#pdf-os.execute)。我尝试通过记录此状态代码来处理无效命令,但发现它有点无用;此外,shell 本身还打印了一条错误消息。

os.execute("hello") -- 'hello' is not a shell command.
> sh: 1: hello: not found

来自 shell 的错误消息没有被我的 Lua 脚本捕获和读取,而是直接发送到 stderr。 (很好的引用:https://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout。)

我发现了一个有趣的解决方案,可以使用临时文件捕获任何错误输出。

tmpname = os.tmpname()
os.execute(string.format("hello 2> %s", tmpname))
for line in io.lines(tmpname) do
print("line = " .. line)
end

这将打印:line = sh: 1: hello: not found ,这是前面描述的错误。 os.execute还应该返回命令的状态,如下所示:

a, b, c = os.execute("echo hello")
> hello
print(a, b, c)
> true exit 0
d, e, f = os.execute("hello") -- An invalid command
> sh: 1: hello: not found
print(d, e, f)
> nil exit 127

在此示例中,cf是各自命令的退出状态。如果上一个命令(即执行 Python 脚本)失败,则退出状态应为非零。

为了解决您关于 Python 的主要问题,我会仔细检查脚本的路径——从简单的健全性检查开始总是一个好主意。考虑使用string.format像这样组装命令:

command = string.format("python %s %i", tostring(path), tonumber(subjectId))
os.execute(command)

此外,了解您正在使用的 Lua/Python 版本以及您的系统也会很有帮助。

编辑:根据您是否需要将它们保留一段时间,您应该删除 os.tmpname 生成的任何临时文件。与 os.remove 。我还尝试通过一个简单的测试来复制您的情况,并且使用 os.execute 执行 Python 脚本没有遇到任何问题。在位于不同目录的 Lua 脚本中。

作为引用,这是 Lua 脚本,名为 test.lua ,我在名为 /tmp/throwaway 的临时目录中创建:

#!/usr/bin/lua

local PATH_TO_PY_FILE = "/tmp/py/foo.py"

local function fprintf(fil, formal_arg, ...)
fil:write(string.format(formal_arg, ...))
return
end

local function printf(formal_arg, ...)
io.stdout:write(string.format(formal_arg, ...))
return
end

local function foo(...)
local t = {...}
local cmd = string.format("python3 %s %s", PATH_TO_PY_FILE, table.concat(t, " "))
local filename = os.tmpname()
local a, b, status = os.execute(string.format("%s 2> %s", cmd, filename))

printf("status = %i\n", status)

local num = 1
for line in io.lines(filename) do
printf("line %i = %s\n", num line)
num = num + 1
end

os.remove(filename)

return
end

local function main(argc, argv)
foo()
foo("hello", "there,", "friend")
return 0
end
main(#arg, arg)

(请原谅我的C风格的main函数,哈哈。)

在一个单独的临时目录中,名为 /tmp/py ,我创建了一个如下所示的 Python 文件:

import sys

def main():
for arg in sys.argv:
print(arg)

if __name__ == '__main__':
main()

Lua脚本的函数foo接受可变数量的参数并将它们作为命令行参数提供给 Python 脚本;然后,Python 脚本只需一一打印这些参数。再说一次,这只是一个简单的概念验证测试。

os.tmpname 创建的临时文件应该在 /tmp ;至于你的文件,即你的 Lua 和 Python 脚本,你要确保你确切地知道这些文件所在的位置。希望这可以解决您的问题。

此外,您还可以将 Python 脚本(或任何其他必要文件)的路径作为命令行参数提供给 Lua 脚本,然后稍微修改现有代码。

$> ./test.lua path-to-python-file

然后只需修改 footest.lua接受 Python 文件的路径作为参数:

local function foo(py_path, ...)
local t = {...}
local cmd = string.format("python3 %s %s", py_path, table.concat(t, " "))
-- Everything else should remain the same.
end

关于python - Lua脚本不会执行python脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56584921/

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