2017-05-08 1 views
0

Ich möchte eine subprocess.call erstellen, um eine Datei zu erstellen (und schließlich ausfüllen). Hier ist mein Code:Kann jemand den Unterschied in zwei Python-Befehlen erklären?

#!/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) 

Gerade jetzt nur die unteren Befehl funktioniert, aber diese beiden Teilprozesse sollten genau die gleiche Sache tun (ich die Datei anders zu Testzwecken genannt haben). Ich weiß, dass es einen besseren Weg gibt, dies zu tun, aber kann jemand für meine eigene Erbauung (und Vernunft) den Unterschied erklären?

~~~~~~~~~~~~~~~~~~~~~~~ EDIT COMPLETE CODE ~~~~~~~~~~~~~~~~~~~~ ~

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 

Der einzige Grund, warum ich die erf müssen, ist die Umgebungsvariable von apache zu erhalten. Ich weiß nicht wirklich, wie das funktioniert, aber ich verwende das in anderem Code ohne Subprozesse.

+6

Nennen Sie jemals die Funktion 'index'? –

+1

Und wenn Sie die Funktion 'index' nirgendwo aufrufen, warum erwarten Sie, dass der Inhalt dieser Funktion aufgerufen wird? –

+0

Wie kann ich es nennen. Welches Argument benötige ich für req? – alexs973

Antwort

0

Ihr erster Anruf an subprocess.call ist innerhalb einer def Anweisung. Eine def Anweisung ruft eigentlich nichts direkt darunter auf, sondern definiert eine Funktion, bei der es sich um einen Codeblock handelt, den Sie irgendwo anders wiederverwenden können.

Der erste "Aufruf" an subprocess.call macht nichts, weil Sie es nur als Teil eines wiederverwendbaren Stücks Code definieren, aber dieses wiederverwendbare Stück Code niemals tatsächlich verwenden.

Wenn Sie wollen „verwenden“, um den ersten Anruf, müssen Sie die Funktion aufrufen, die Sie gerade def definiert mit:

Fügen Sie Folgendes am Ende des Skriptes:

index(None) 

und die "first" call sollte passieren, aber nach dem ersten.

Sie können mehr darüber lesen, wie die def Anweisung funktioniert und über Funktionen here.

+0

Ich habe versucht, Index (keine), aber ich bekomme einen Fehler, der sagt 'Name 'keine' ist nicht definiert '. Ich kann es auch nicht leer lassen, weil es ein Argument req erfordert. Ich brauche diese Funktion, um diesen Befehl zu verwenden 'port = str (reqprocess_env ['SSL_CLIENT_S_DN_CN'])' – alexs973

+0

Sie müssen Ihre Frage bearbeiten und ein * vervollständigen * Beispiel einschließen. Siehe [MCVE]. – TemporalWolf

+1

Wenn Sie einen Fehler erhalten, der besagt, dass 'none' nicht definiert ist, bedeutet dies, dass Sie' None' getönt haben. – kindall

Verwandte Themen