python中的子流程模块

python中的子流程模块,python,subprocess,Python,Subprocess,我必须连接到sybase数据库并使用python脚本运行一个简单的select查询 在我的服务器上,isql命令只能从sybase bin目录运行,因此我必须在启动查询之前将其cd到该目录 ------------------------------------已编辑-------------------- Uptill现在我可以做到这一点:- #!/usr/bin/python import subprocess path = "path/to/sybase/bin" os.chd

我必须连接到sybase数据库并使用python脚本运行一个简单的select查询

在我的服务器上,isql命令只能从sybase bin目录运行,因此我必须在启动查询之前将其cd到该目录

------------------------------------已编辑--------------------

Uptill现在我可以做到这一点:-

#!/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
我可以在unix终端上使用isql命令在python脚本之外执行此操作


如何在python子流程模块中使用isql?

Popen只接受一个args参数,命令才能运行。您可以尝试使用cd和isql命令作为参数调用shell,但是从python更改工作目录可能更简单

对于前一种方法:

subprocess.Popen('/bin/sh -c "cd /path/to/... && isql -arg1..'...)
对于后者:

os.chdir('/path/to...')
subprocess.Popen('isql -arg1..'...)
尝试:

导入操作系统
导入子流程
chdir('/path/to/sybase/bin'))
如果os.path.exists('isql')或os.path.exists(os.path.join('/path/to/sybase/bin','isql')):

ps=subprocess.Popen('isql-S%S-U%S-P%S-D%S

有一个特定的

Popen
参数:cwd,如前所述。使用数组提供命令,然后使用cwd参数指定必须执行命令的位置:

subprocess.Popen(['ls', '-l'], cwd="/path/to/folder")

我知道已经很久了,但我只是想结束这个问题

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]

使用导入os;os.chdir(路径)更改路径。从字符串中删除括号。事实上,您可以完全删除方括号。如果不起作用,则该文件夹中可能不存在相同的错误。请检查我的答案更新。如何将其作为参数传递?['isql','-S server'-U%S-P%S-D%S是的。这里的大多数其他答案都忽略了您将命令作为字符串传递而没有使用
shell=True
,这将无法正常工作。当您使用
shell=False
时,您必须将命令及其参数作为列表传递。此外,如果您需要帮助将命令拆分为正确地放入列表中,您可以使用
shlex.split()
函数:就像前面提到的@dano一样,您可以使用选项
shell=True
在shell中发出命令(尽管文档中说这是不安全的)。如果您仅使用
子流程运行命令,那么使用专用库(如@u Entity)可能会起作用的其他方法。Popen(['./isql'])
(没有任何参数)是否起作用?
subprocess.Popen(['ls', '-l'], cwd="/path/to/folder")
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]