我无法在我编写脚本的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')
所以看起来我的沟通方法不起作用,但我不确定为什么?
干杯