2

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());
4

1 に答える 1

3

PostgreSQL トリガーまたは関数内からコマンドライン プログラムを呼び出したいと思われます。

通常より良い代替手段は、トリガーに を送信させ、通知のためにNOTIFYPostgreSQL 接続を使用してプロセスを実行させることです。LISTEN通知が届くと、プロセスはプログラムを開始できます。これが私が推奨するアプローチです。これは非常にクリーンであり、プログラムを PostgreSQL のユーザー ID で実行する必要がないことを意味します。NOTIFYおよびを参照してくださいLISTEN

本当に Pg 内からコマンドを実行する必要がある場合:

または;PL/Pythonuと一緒に使用できます。と; これらはすべて、必要に応じて Pg 内からコマンドを実行できます。PostgreSQL からプログラムを直接呼び出すことはできません。外部の実行可能ファイルを呼び出すには、「信頼されていない」(サンドボックス化されていない完全な特権を意味する) 手続き型言語のいずれかを使用する必要があります。PL/TCL もおそらくそれを行うことができます。os.systemsubprocess.check_callPL/Perlusystem()

更新

上記の Python コードにはいくつかの問題があります。

  • os.systemファイルをコピーするためにPythonで使用するのは間違っています。ライブラリを使用しshutilます: http://docs.python.org/3/library/shutil.htmlファイルをコピーし、os.mkdirディレクトリを作成する簡単なコマンドを使用します。
  • 二重引用符は間違っているように見えます。コマンド全体ではなく、各引数のみを引用するつもりはありませんでしたか? とにかくsubprocess.call代わりに使用する必要があります。os.system
  • 最終的なsubprocess.call呼び出しは問題ないように見えますが、エラー コードのチェックに失敗しているため、エラーが発生したかどうかはわかりません。subprocess.check_call代わりに使用する必要があります。

C++ コードは、system()呼び出しからのエラーのチェックにも失敗しているように見えるため、実行するコマンドが失敗したかどうかはわかりません。

copyPython コードと同様に、シェル コマンドを使用して C++ でファイルをコピーすることは一般的に間違っています。Microsoft Windows はこのCopyFile機能を提供します。他のプラットフォームには同等または代替が存在し、移植可能ですが効率の悪いストリームコピーも使用できます。

于 2013-03-10T07:25:30.293 に答える