2017-05-08 59 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

相關問題