postgres 9.2 データベースのトリガーから生成された Python プログラムから外部プログラムを実行しようとすると、問題が発生します。トリガーが効きます。ファイルに書き込みます。外部プログラムを実行しようとしましたが、許可により実行できませんでした。フォルダーを作成できました ( os.system(“mkdir”) を使用)。フォルダの所有者は NETWORK SERVICE です。
sdktest というプログラムを実行する必要があります。実行しようとしても応答がありません。これは、python プログラムに (NETWORK SERVICE の所有者が) 実行するのに十分な権限がないことを意味すると思います。
プログラムに必要なファイルをそのディレクトリにコピーさせて、正しいアクセス許可を取得し、ある程度機能しましたが、実行する必要があるプログラムは最後のプログラムであり、実行されていないため実行されていません十分な権限。
私の python プログラムは、sdktest を呼び出す PG_QB_Connector という C++ プログラムを実行します。
プロセスの所有者を「通常の」所有者に変更する方法はありますか? これを行うより良い方法はありますか?基本的に、この C++ プログラムを正しく実行するのに十分なパーマが必要です。
ところで、C++ プログラムを手動で実行すると、sdktest プログラムを実行する行は正しく実行されますが、postgres/python から実行すると何もしません...
私はWindows 7、python 3.2を持っています。これについて私が尋ねた他の2つの質問は、 ここ と ここにあります
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());