c – Python不调用外部程序第3部分
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – Python不调用外部程序第3部分,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3428字,纯文字阅读大概需要5分钟。
内容图文
![c – Python不调用外部程序第3部分](/upload/InfoBanner/zyjiaocheng/697/ed43d9896e2e4533b5b7c334e40078b0.jpg)
我一直在尝试从postgres 9.2数据库中的触发器生成的python程序运行外部程序时遇到问题.触发器有效.它写入文件.我曾尝试过只运行外部程序,但权限不允许它运行.我能够创建一个文件夹(使用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触发器或函数中调用命令行程序.
通常更好的替代方法是让触发器发送NOTIFY并且具有PostgreSQL连接的进程LISTENing用于通知.当收到通知时,该过程可以启动您的程序.这是我建议的方法;它更清洁,这意味着你的程序不必在PostgreSQL的用户ID下运行.见NOTIFY和LISTEN.
如果你真的需要从Pg内部运行命令:
您可以将PL/Pythonu与os.system或subprocess.check_call一起使用; PL/Perlu with system();如果需要,所有这些都可以从Pg内部运行命令.您无法直接从PostgreSQL调用程序,您需要使用“不受信任”(意味着完全特权,而不是沙盒)过程语言之一来调用外部可执行文件. PL / TCL也可以这样做.
更新:
您的Python代码如上所示有几个问题:
>在Python中使用os.system复制文件是错误的.使用shutil库:http://docs.python.org/3/library/shutil.html复制文件,使用简单的os.mkdir命令创建目录.
>双层引用看起来不对;你是不是只想引用每个参数而不是整个命令?无论如何你应该使用subprocess.call而不是os.system.
>您的最终subprocess.call调用显示正常,但无法检查错误代码,因此您永远不会知道它是否出错;你应该使用subprocess.check_call.
C代码似乎也无法检查来自system()调用的错误,因此您永远不会知道它运行的命令是否失败.
与Python代码一样,使用copy shell命令在C中复制文件通常是错误的. Microsoft Windows为此提供了CopyFile功能;在其他平台上存在等价物或替代品,您也可以使用便携式但效率较低的流复制.
内容总结
以上是互联网集市为您收集整理的c – Python不调用外部程序第3部分全部内容,希望文章能够帮你解决c – Python不调用外部程序第3部分所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。