为什么我用子进程解析shell = True?

时间:2015-06-05 22:19:08

标签: python subprocess

我尝试运行此命令:

subprocess.call('''psql --username=openerp --dbname=sf_template_20150605121222 --no-password --command="select table_schema, table_name, count_rows(table_schema, table_name) from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema') and table_type='BASE TABLE' order by 1, 2 desc" > ~/sf_template.old.txt''', shell=True)

在shell中得到这样的错误:

/bin/sh: 1: cannot create ~/sf_template.old.txt: Directory nonexistent
我做错了吗?为什么我不能将文件解析为我当前的用户家?用户是常规用户(即我当前登录的用户),其具有主目录。

1 个答案:

答案 0 :(得分:1)

错误消息显示~未在您的案例中展开。它表明你已经通过了错误的环境:

>>> from subprocess import call
>>> call('echo >~/nonexistent/dir', shell=True)
/bin/sh: 1: cannot create /home/me/nonexistent/dir: Directory nonexistent
2
>>> call('echo >~/nonexistent/dir', shell=True, env={})
/bin/sh: 1: cannot create ~/nonexistent/dir: Directory nonexistent
2
>>> call('echo >~/nonexistent/dir', shell=True, env=dict(HOME='abc'))
/bin/sh: 1: cannot create abc/nonexistent/dir: Directory nonexistent
2

注意:代字号在第一种情况和最后一种情况下都会扩展。

您应该使用env=dict(os.environ, YOUR_VAR='1')代替env=dict(YOUR_VAR='1')

POSIX defines Tilde expansion as

  

如果登录名为null(即,tilde-prefix仅包含   代字号),代字号前缀由变量的值代替   家。如果未设置HOME,则结果未指定。