我必须连接到sybase数据库并使用python脚本运行简单的选择查询
在我的服务器上,isql命令只能从sybase bin目录运行,因此我必须在触发查询之前cd到该目录。
---------------------------编辑---------------- -------------
现在我可以这样做: -
#!/usr/bin/python
import subprocess
path = "path/to/sybase/bin"
os.chdir(path)
arguments = ['./isql',"-S server_name", "-U user", "-P password", "-D database","""<<EOF
SELECT * FROM sometable
go
EOF"""]
ps = subprocess.Popen(arguments)
out = ps.communicate()
print out
错误只是出于我的理解能力:(
Traceback (most recent call last):
File "./test_db.py", line 8, in ?
ps = subprocess.Popen(arguments)
File "/usr/lib64/python2.4/subprocess.py", line 542, in __init__
errread, errwrite)
File "/usr/lib64/python2.4/subprocess.py", line 975, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我可以在我的python脚本之外使用我的unix终端上的isql命令
执行此操作如何在python子进程模块中使用isql?
答案 0 :(得分:1)
有一个特定的Popen
参数: cwd ,如上所述here。使用数组提供您的命令,然后使用 cwd 参数来执行命令必须执行的位置:
subprocess.Popen(['ls', '-l'], cwd="/path/to/folder")
答案 1 :(得分:0)
Popen只接受一个args参数,以便运行该命令。您可以尝试使用cd和isql命令作为参数调用shell,但是从python更改工作目录可能更简单
对于前一种方法:
subprocess.Popen('/bin/sh -c "cd /path/to/... && isql -arg1..'...)
对于后者:
os.chdir('/path/to...')
subprocess.Popen('isql -arg1..'...)
答案 2 :(得分:0)
尝试:
import os
import subprocess
os.chdir('/path/to/sybase/bin')
if os.path.exists('isql') or os.path.exists(os.path.join('/path/to/sybase/bin', 'isql')):
ps = subprocess.Popen('isql -S %s -U %s -P %s -D %s <<EOF SELECT * FROM sometable EOF' % (server,user,passwd,database), stdout=subprocess.PIPE, shell=True)
out, err = ps.communicate()
else:
print "isql does not exists in this folder"
我对子流程没有超级经验,但这是我通常在奇怪的场合使用它的方式。希望其他人可以给出更好的答案/解释。
编辑:删除方括号以消除混淆。
答案 3 :(得分:0)
我知道它已经很久但只想关闭这个问题
from subprocess import Popen, PIPE
from textwrap import dedent
isql = Popen(['./isql', '-I', '/app/sybase/...',
'-S', mdbserver,
'-U', muserid,
'-P', password, ...,
'-w', '99999'], stdin=PIPE, stdout=PIPE, cwd=sybase_path)
output = isql.communicate(dedent("""\
SET NOCOUNT ON
{}
go
""".format(User_Query)))[0]