2017-05-08 57 views
0

我想要做一个subprocess.call创建一个文件(并最终填充它)。这里是我的代码:有人可以解释两个Python命令的区别吗?

#!/usr/bin/python 
import sys 
import subprocess 
import psycopg2 
import base64 
import urlparse 
sys.path.append('/var/www/cgi-bin') 

def index(req): 
    out = "" 

    mkFile = str("touch /etc/httpd/conf/ipForward/90.conf") 
    subprocess.call([mkFile],shell=True) 

    return out 

mkFile = str("touch /etc/httpd/conf/ipForward/111.conf") 
subprocess.call([mkFile],shell=True) 

眼下只有底部命令的工作,但这两个子进程应该做同样的事情(我命名为不同的测试目的文件)。我知道有一个更好的方法来做到这一点,但是,为了我自己的教诲(和理智),有人可以解释这种差异吗?

~~~~~~~~~~~~~ 〜

def index(req): 
    out = "" 
    conn = psycopg2.connect("dbname='pwp' host='localhost' user='~~~' password='~~~~~'") 
    c = conn.cursor() 

    inClCN = str(req.subprocess_env['SSL_CLIENT_S_DN_CN']) 

    c.execute("select * from Users where cn = '{0}';".format(inClCN)) 
    rows = c.fetchall() 
    for row in rows: 
     port = row[0] 

    mkFile = str("touch /etc/httpd/conf/ipForward/{0}.conf".format(port)) 
    subprocess.call([mkFile],shell=True) 

    insert = r"""Listen {0}\n\n<VirtualHost _default_:{1}>\n\nDocumentRoot '/var/www/html/'\nDirectoryIndex indexAlex.py\n\nRewriteEngine On\n\nErrorLog /etc/httpd/logs/error_log\nTransferLog /etc/httpd/logs/access_log\nLogLevel warn\n\n\nNSSVerifyClient require\n\nNSSEngine on\nNSSFIPS on\nNSSProtocol(MORE CONF STRING)</VirtualHost>""".format(port,port) 

    confFile = str('echo "{0}" >> /etc/httpd/conf/ipForward/{1}.conf'.format(insert,port)) 

    subprocess.call([confFile],shell=True) 

    return out 

我需要req的唯一原因是从apache获取环境变量。我真的不知道这是如何工作的,但我一直在其他没有子流程的代码中使用它。

+6

你有没有真的在任何地方调用函数'index'? –

+1

如果你没有在任何地方调用函数'index',你为什么期望该函数的内容被调用? –

+0

我怎么称呼它。我需要什么参数来请求? – alexs973

回答

0

您的第一个电话subprocess.call是在def声明之内。一个def语句实际上不会立即调用它下面的任何东西,而是它定义了一个函数,它是可以在其他任何地方重用的代码块。

subprocess.call的第一个“调用”不会做任何事情,因为您只是将其定义为可重用代码块的一部分,但从未实际使用过这种可重用代码块。

如果你想“用”第一个电话,你需要调用刚刚定义的函数使用def

以下内容添加到您的脚本的末尾:

index(None) 

和“第一”电话应该发生,但在第一次之后。

您可以阅读关于def声明如何工作的更多信息,以及有关函数here的更多信息。

+0

我试过把索引(无),但我得到一个错误,说'名字'没'没有定义'。我也不能把它留空,因为它需要一个参数req。我需要这个功能,使用此命令'端口= STR(req.subprocess_env [“SSL_CLIENT_S_DN_CN”])' – alexs973

+0

你需要修改你的问题,包括*完整*例子。见[mcve]。 – TemporalWolf

+1

如果你收到一个错误,说'没有'没有被定义,这意味着你打字'无'。 – kindall

相关问题