【问题标题】:Python not calling an external program part 2Python 不调用外部程序第 2 部分
【发布时间】:2013-01-17 02:51:26
【问题描述】:

我在运行 python 程序(真的是 plpython3u)作为 postgres (9.2) 的触发器时遇到问题。触发器使用以下语句调用 python 程序: 执行 scalesmyone(new.id);

python 程序成功地将某些内容写入文件(这向我表明触发器正在工作),然后尝试在我的 Windows 7 机器上的 C: 驱动器上运行程序。它失败并出现以下错误:错误:WindowsError:[错误5]访问被拒绝。我现在正在使用子进程调用,但之前我尝试过子进程调用,但没有奏效。可以看到here

代码如下:

CREATE or replace FUNCTION scalesmyone (thename text)
RETURNS int
AS $$
a=5
f = open('C:\\JUNK\\frompython.txt','w')
f.write(thename)
f.close()
import subprocess
return_code = subprocess.call(["C:\\Users\\Jim\\Desktop\\BATfiles\\run_addcust.bat", '"hello"'])
$$ LANGUAGE plpython3u;

文件在那里。

吉姆

【问题讨论】:

  • 你有追溯吗?如果你这样做,请发布它。是f = 行还是return_code = 行的错误?
  • 触发器在程序被触发的目录中是否有执行权限?或者触发器是否有可能同时触发,所以第二次运行尝试写入同一个文件,而第一次运行仍在使用该文件?
  • @Thomas This is running the exe.It's the same error code CONTEXT: Traceback (most recent call last): PL/Python function "scalesmyone", line 7, in return_code = subprocess.call(['"C:\\Users\\Jim\\Documents\\Visual Studio 2008\\Projects\\addcustomer\\Debug\\AddNewCustomer.exe"', '"hello"']) PL/Python函数“scalesmyone”,第 470 行,调用 PL/Python 函数“scalesmyone”,第 744 行,init PL/Python 函数“scalesmyone”,第 963 行,_execute_child PL/Python 函数“scalesmyone”下一条评论中的最后两行
  • @Jim 使用堆栈跟踪编辑您的问题
  • @Thomas 直接运行 exe 的最后两行回溯: SQL 语句 "SELECT scalesmyone(new.id)" PL/pgSQL function scalesins_function() line 13 at PERFORM

标签: python postgresql


【解决方案1】:

该错误表明运行 Postgres/plpython 的用户对该 .bat 文件没有执行权限(至少这是我在普通 Python 程序中得到的)。这可能不是子进程本身的问题。

【讨论】:

  • 如何检查 bat 文件的权限?右击文件还是你在想别的?
  • 冒险进入不愉快的土地等着你,我的意思是新的 (2008/Win7) 风格的权限。只是在开玩笑。右键单击一个文件,单击属性,单击安全选项卡。您在那里有特定的用户(顶部窗格)和权限(底部窗格),您必须正确设置读取和执行权限。
  • 虽然有时这很棘手,但如果您发现谁是试图创建文件的 plpython 进程的“所有者”,那就简单多了。比如说,让这个触发器/脚本在某处写入一些文件,比如 C:\temp 或 smth,然后查找所创建文件的所有者是谁(rclick、属性、安全性、高级,单击所有者选项卡)。然后将 .bat 脚本复制到 plpython 进程所有者可访问的文件夹中,并将该所有者也给它。您可以通过为自己分配对该脚本的完全控制权限来轻松地使这些脚本可编辑。这样,两个所有者都可以访问它。
  • 还有一件事:如果您的触发器/plpython 进程试图将某些内容写入它无权写入的文件夹或文件中怎么办?这可能是另一个问题。如果你能得到它,堆栈跟踪将非常有帮助。
  • ,我的原始帖子可能令人困惑,COPY 有效。我这样做只是为了测试触发器是否有效并且确实有效。我真的想运行 BAT 或 EXE 文件。那是我的目标。如果您可以看到堆栈跟踪,则表明它在子进程行上存在权限问题。我昨晚看了。具有 BAT 和 EXE 文件的文件夹在 perm 窗口中设置了只读标志。改变它没有奏效。我使用 attrib -r 来更改它,但这没有用。我尝试使用标志,但什么也没做。知道我该如何改变吗?这才是真正的问题。 @mrkafk
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多