python中的子进程模块

时间:2014-05-22 10:24:20

标签: python subprocess

我必须连接到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?

4 个答案:

答案 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]