python 2.6子进程输入psql密码C shell

时间:2015-06-18 01:35:08

标签: python-2.6 psql csh

我无法在我编写脚本的AIX服务器上安装任何其他模块。它安装了Python 2.6.2,基本上我正在尝试运行以下命令

psql -c "select * from cms_agprm;" -o u350932.txt -d tctmsv80 -U tctmsv80

现在我已经做了一些调整,并找到了一些关于如何做到这一点的不同建议。没有取得多大成功。我也有点偏执,因为我正在处理流程,并希望确保我在这个剧本中把事情做好,否则事情很快就会形成梨形。

我已尝试设置环境变量,因此在进行psql调用时不会提示输入密码。

p_env = subprocess.Popen(["setenv", "PGPASSWORD", "password"], shell=True)
print_env = subprocess.Popen(["env"], shell=True)
print 'sending psql command'
p = subprocess.Popen(["psql", "-c", "select * from cms_agprm;", "-o", "/apps/ctm/80/devsv/temp/old_jobs/u350932.txt", "-d", "tctmsv80", "-U", "tctmsv80"], shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

这似乎是最优雅的方式,因为我不必处理此进程命令的输入和输出(密码提示等)。但是代码似乎运行没有错误,但我没有留下该查询的输出文件。环境变量似乎也已设置。我不知道发生了什么,对我可能做错的任何帮助都会非常感激。

更新:

我意识到在使用env =时我需要传递所有环境变量....这将是一个挑战,因为我必须设置相当多。输入密码会更容易。我没试过下面的代码。

print 'sending psql command'
p = subprocess.Popen(["psql", "-c", "'select * from cms_agprm;'", "-d", "tctmsv80", "-U", "tctmsv80"], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdout.read()
p.stdin.write('password\n')
p.stdin.flush()
p.kill()

悬挂输出:

ctmtest1-tctmsv80 [8] python clean_jobs_main.py
script to clean up old jobs
sending psql command
Password:
按下回车后

Traceback (most recent call last):
  File "clean_jobs_main.py", line 21, in <module>
    sys.exit(main())
  File "clean_jobs_main.py", line 18, in main
    old_job_list = get_old_jobs()
  File "clean_jobs_main.py", line 12, in get_old_jobs
    p.stdin.write('password\n')
IOError: [Errno 32] Broken pipe

更新2:

我回到绘图板,觉得我已经靠近了。

command_line = "psql -c 'select * from cms_agprm;' -o u350932.txt -d tctmsv80 -U tctmsv80"
print(command_line)
p_cmd = shlex.split(command_line)
print p_cmd
print 'sending psql command'
p = subprocess.Popen(p_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
r = p.communicate('password\n')
print r

输出:它一直挂到我按下

ctmtest1-tctmsv80 [6] python clean_jobs_main.py
script to clean up old jobs
psql -c 'select * from cms_agprm;' -o u350932.txt -d tctmsv80 -U tctmsv80
['psql', '-c', 'select * from cms_agprm;', '-o', 'u350932.txt', '-d', 'tctmsv80', '-U', 'tctmsv80']
sending psql command
Password for user tctmsv80:

当我按下回车键时:

('', 'psql: fe_sendauth: no password supplied\n')

所以看起来我的沟通方法不起作用,但我不确定为什么?

干杯

0 个答案:

没有答案