2017-07-08 5 views
0

Meine Python Cod hält mich Fehler wie Einrückung und Syntax, die ich sie beheben, aber ohne Erfolg. So, hier ist der Code, den ich verwende ich bin noch nicht sicher, was ich falsch hier tun (BTW ist dies nur wegen einem Streit mit einem Freund über das, was ich nicht tun kann)Fehler mit meinem Python-Code

import requests 
import subprocess 
import json 
import sys 
import threading 
import time 
from Queue import Queue 

numberOfViewers = int(sys.argv[1]) 
builderThreads = int(sys.argv[2]) 
startTime = time.time() 
numberOfSockets = 0 
concurrent = 25 
urls = [] 
urlsUsed = [] 

def getURL(): # Get tokens 
    output = subprocess.Popen(["livestreamer", "twitch.tv/CHANNEL_NAME", "-j"], stdout=subprocess.PIPE).communicate()[0] 
     return json.loads(output)['streams']['worst']['url'] # Parse json and return the URL parameter 

def build(): # Builds a set of tokens, aka viewers 
     global numberOfSockets 
     global numberOfViewers 
     while True: 
       if numberOfSockets < numberOfViewers: 
         numberOfSockets += 1 
         print "Building viewers " + str(numberOfSockets) + "/" + str(numberOfViewers) 
         urls.append(getURL()) 

def view(): # Opens connections to send views 
     global numberOfSockets 
     while True: 
       url=q.get() 
       requests.head(url) 
       if (url in urlsUsed): 
         urls.remove(url) 
         urlsUsed.remove(url) 
         numberOfSockets -= 1 
       else: 
         urlsUsed.append(url) 
       q.task_done() 

if __name__ == '__main__': 
     for i in range(0, builderThreads): 
       threading.Thread(target = build).start() 

     while True: 
       while (numberOfViewers != numberOfSockets): # Wait until sockets are built 
         time.sleep(1) 

       q=Queue(concurrent*2) 
       for i in range(concurrent): 
         try: 
           t=threading.Thread(target=view) 
           t.daemon=True 
           t.start() 
         except: 
           print 'thread error' 
       try: 
         for url in urls: 
           print url 
           q.put(url.strip()) 
           q.join() 
       except KeyboardInterrupt: 
         sys.exit(1) 
+0

Hallo @flamelier Willkommen zu StackOverflow. Bitte posten Sie Ihren Fehler, um Ihren Beitrag zu verbessern. Auf diese Weise können andere Programmierer Ihnen helfen, Ihr Fehler/Programm zu debuggen. –

Antwort

0

Sie haben ein paar Fehler im Code:

1: print: Wenn Sie Python3 verwenden -

The print statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old print statement

für mehr information about whats new in python 3

2: Einrückungen: Wenn Sie diesen Fehler erhalten: IndentationError: expected an indented block das heißt, Sie haben falsche Einrückungen. Als eine interpretierte Sprache richtige Vertiefung für Python notwendig und wichtig ist:

Leading whitespace (spaces and tabs) at the beginning of a logical line is used to compute the indentation level of the line, which in turn is used to determine the grouping of statements.

für mehr Informationen Blick auf Python reference manual for Indentation

Festcodebeispiel:

ich diese Fehler für Sie festgelegt und unten ist, wie es sollte wie folgt aussehen:

import requests 
import subprocess 
import json 
import sys 
import threading 
import time 
from Queue import Queue 

numberOfViewers = int(sys.argv[1]) 
builderThreads = int(sys.argv[2]) 
startTime = time.time() 
numberOfSockets = 0 
concurrent = 25 
urls = [] 
urlsUsed = [] 

def getURL(): # Get tokens 
    output = subprocess.Popen(["livestreamer", "twitch.tv/CHANNEL_NAME", "-j"], 
    stdout=subprocess.PIPE).communicate()[0] 
    return json.loads(output)['streams']['worst']['url'] # Parse json and return the URL parameter 

def build(): # Builds a set of tokens, aka viewers 
    global numberOfSockets 
    global numberOfViewers 
    while True: 
    if numberOfSockets < numberOfViewers: 
     numberOfSockets += 1 
     print ("Building viewers " + str(numberOfSockets) + "/" + str(numberOfViewers)) 
     urls.append(getURL()) 

def view(): # Opens connections to send views 
    global numberOfSockets 
    while True: 
    url=q.get() 
    requests.head(url) 
    if (url in urlsUsed): 
     urls.remove(url) 
     urlsUsed.remove(url) 
     numberOfSockets -= 1 
    else: 
     urlsUsed.append(url) 
     q.task_done() 

     if __name__ == '__main__': 
     for i in range(0, builderThreads): 
      threading.Thread(target = build).start() 

      while True: 
      while (numberOfViewers != numberOfSockets): # Wait until sockets are built 
       time.sleep(1) 

       q=Queue(concurrent*2) 
       for i in range(concurrent): 
       try: 
        t=threading.Thread(target=view) 
        t.daemon=True 
        t.start() 
       except: 
        print ('thread error') 
        try: 
        for url in urls: 
         print (url) 
         q.put(url.strip()) 
         q.join() 
        except KeyboardInterrupt: 
        sys.exit(1) 

3. Import Fehler: Kein Modul namens 'requests'

Das bedeutet, dass Ihre Modulanforderung fehlt. Installieren Sie es einfach mit der Befehlszeile, wenn Sie Windows oder Terminal haben, wenn Sie einen Mac haben.

$ sudo pip install requests --upgrade 
+0

Also habe ich den Code, den Sie dort hatten, und hier ist, was es mir sagt: raceback (zuletzt letzten Anruf): Datei "C: \ Users \ florelier \ Desktop \ Twitch.py", Zeile 1, in importieren Anfragen ImportError: Kein Modul namens 'Anfragen' – flamelier

+0

Das ist ein ganz anderer Fehler. Normalerweise würde ich vorschlagen, dass Sie es in einer neuen Frage stellen. aber ich werde meine Antwort bearbeiten, um Ihren neuen Fehler zu berücksichtigen –

1

Sie Sie müssen Ihren Code einrücken. Python mag es nicht, wenn Sie dies tun zum Beispiel:

def main(): 
print "Hello World!" 

Python will Einzüge (ich glaube es 4 Räume ist)

def main(): 
    print "Hello World!" 

Welche Zeilennummer ist es, wo Sie Syntax und indent Fehler haben? Apropos?

1

Python verwendet Einrückung zum Definieren von Blöcken anstelle von {}.

Sie sollten auch die erste Einrückung während des gesamten Dokuments formatieren. Das heißt, wenn Sie mit Tabs beginnen, müssen Sie immer Tabs verwenden, auch wenn Leerzeichen optisch gleich aussehen. Wenn Sie 4 Leerzeichen verwenden, können Sie später im Code für Tabs oder mehr Platz nicht mehr ändern.

Der Fehler, den Sie erwähnten, tritt normalerweise auf, weil Sie Code aus dem Internet eingefügt haben und es Registerkarten verwendet und Sie Leerzeichen verwenden oder umgekehrt.

Ich empfehle, den gesamten Code, da es kurz ist, neu zu indden.