【发布时间】:2013-03-10 22:17:06
【问题描述】:
我在尝试从 python 程序运行外部程序时遇到问题,该程序是从 postgres 9.2 数据库中的触发器生成的。触发器起作用。它写入文件。我曾尝试只运行外部程序,但权限不允许它运行。我能够创建一个文件夹(使用 os.system(“mkdir”) )。该文件夹的所有者是 NETWORK SERVICE。
我需要运行一个名为 sdktest 的程序。当我尝试运行它时没有响应,所以我认为这意味着 python 程序没有足够的权限(具有 NETWORK SERVICE 的所有者)来运行它。
我一直在让我的程序将它需要的文件复制到该目录中,以便它们具有正确的权限,并且在某种程度上已经起作用,但是我需要运行的程序是最后一个程序并且它没有运行,因为它没有足够的权限。
我的 python 程序运行一个名为 PG_QB_Connector 的 C++ 程序,它调用 sdktest。
有什么方法可以将进程的所有者更改为“正常”所有者?有一个更好的方法吗?基本上我只需要让这个 C++ 程序有足够的权限才能正常运行。
顺便说一句,当我手动运行 C++ 程序时,运行 sdktest 程序的行运行正常,但是,当我从 postgres/python 运行它时,它什么也没做......
我有 Windows 7,python 3.2。我问的另外两个问题位于here 和here
python 程序:
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 os
os.system('"mkdir C:\\TEMPWITHOWNER"')
os.system('"mkdir C:\\TEMPWITHOWNER\\addcustomer"')
os.system('"copy C:\\JUNK\\junk.txt C:\\TEMPWITHOWNER\\addcustomer"')
os.system('"copy C:\\BATfiles\\junk6.txt C:\\TEMPWITHOWNER\\addcustomer"')
os.system('"copy C:\\BATfiles\\run_addcust.bat C:\\TEMPWITHOWNER\\addcustomer"')
os.system('"copy C:\\Workfiles\\PG_QB_Connector.exe C:\\TEMPWITHOWNER\\addcustomer"')
os.system('"copy C:\\Workfiles\\sdktest.exe C:\\TEMPWITHOWNER\\addcustomer"')
import subprocess
return_code = subprocess.call(["C:\\TEMPWITHOWNER\\addcustomer\\PG_QB_Connector.exe", '"hello"'])
$$ LANGUAGE plpython3u;
从python程序调用并调用sdktest.exe的C++程序如下
command = "copy C:\\Workfiles\\AddCustomerFROMWEB.xml C:\\TEMPWITHOWNER\\addcustomer\\AddCustomerFROMWEB.xml";
system(command.c_str());
//everything except for the qb file is in my local folder
command = "C:\\TEMPWITHOWNER\\addcustomer\\sdktest.exe \"C:\\Users\\Public\\Documents\\Intuit\\QuickBooks\\Company Files\\Shain Software.qbw\" C:\\TEMPWITHOWNER\\addcustomer\\AddCustomerFROMWEB.xml C:\\TEMPWITHOWNER\\addcustomer\\outputfromsdktestofaddcust.xml";
system(command.c_str());
【问题讨论】:
-
我是否正确理解 PostgreSQL 触发器正在生成 Python 程序并将其写入您想从 C++ 程序调用的文件中?这种设计充其量看起来非常奇怪。我怀疑与其使当前的设计工作,不如改变方法。你知道 PL/Python 吗?您是否考虑过在您的 C++ 程序中嵌入 Python 解释器,通过 libpq 连接从 Pg 获取程序文本并在嵌入式 Python 解释器中执行它?
-
@CraigRinger,不,这不是我想做的。在最基本的形式中,我希望来自 postgres 的触发器运行我创建的名为 PG_QB_Connector 的 C++ 程序。该程序将进行一些处理并调用 sdktest。我什至不关心 python 作为 postgres 的一部分。我只需要一些方法让 postgres 触发器运行程序。至于您的建议,我认为您的 libq 连接不会对此有所帮助,对吗?我是否认为我需要一个来自 PG 而不是进入的连接?
-
是的,你正在尝试做一些与我想象的不同的事情。现在添加答案。
-
您还需要检查错误并清理调用命令和执行复制文件和创建目录等任务的方式,以便使用语言工具而不是尝试调用 shell 命令。 +1 链接到您之前的问题。
标签: c++ python postgresql