简体   繁体   中英

Python 2.7 is giving me inexplicable “syntax errors”

I wrote a script in python3.3 to sync two directories on windows which worked perfectly; later I wanted to make it an executable, and so I ported it to python 2.7 (cx_freeze gives me "module not found" errors). I'm running into this one weird problem though, which is whenever I input a file path to my program it gives me an error; for example if I put in "C:\\Users\\Me\\SourceDir" the program breaks, outputting

File "<string>", line 1
C:\Users\Me\SourceDir
 ^
Syntax Error: Invalid Syntax

I'm confused as to why this is. The program runs fine under python3.3 (with the same paths, I should add), which leads me to believe that there's something weird going on with 2.7 behind the scenes.

Can anyone explain to me why this happens and how to fix it?

Also here's the program's source, although I dont feel like it really matters

    '''
Created on Mar 18, 2013

@author: pipsqueaker
'''
import os, shutil, time
from datetime import datetime

class mainClass():

    def __init__(self):
        self.srcDir = []
        self.dst = []
        self.iteration = 1
        self.fileHash = {}
        self.slash  = ""

    def getParentDir(self, string, slash):
        slashCount = 0
        tempCount = 0
        realDir = ""
        for x in string:
            if x == "/" or x == "\\":
                slashCount += 1
        for y in string:
            if y == "/" or y == "\\":
                tempCount += 1
            if tempCount < slashCount:
                realDir += y
            else:
                break
        realDir += slash
        return realDir

    def initializeDirs(self):
        #Initialize Paths from the setup files
        onWindows = (os.name == 'nt')
        if onWindows:
            self.slash = "\\"
        else:
            self.slash = "/"

        os.chdir(self.getParentDir(os.path.realpath(__file__), self.slash))

        if os.path.exists("srcDir") == False:
            print("The srcDir file does not exist; Creating Now...")
            self.srcDir = input("Please input source directory \n")
            self.newSource = open("srcDir", "w")
            if self.srcDir[self.srcDir.__len__() -1] != self.slash:
                self.srcDir += self.slash
            self.newSource.write(self.srcDir)
            self.newSource.close()

        if os.path.exists("dstDirs") == False:
            print("The dstFirs file does not exits; Creating Now...")
            print("Input a directory to sync to. Or just type xit to exit")

            self.newDst = open("dstDirs", "w")
            while True:
                self.IN = input()
                if os.name == 'nt': #Windows
                    self.IN.replace("/", "\\")
                else:
                    self.IN.replace("\\", "/")

                if self.IN != "xit":
                    if self.IN[self.IN.__len__() -1] != self.slash:
                        self.IN += self.slash
                    self.newDst.write(self.IN)
                    self.dst.append(self.IN)
                else:
                    self.newDst.close()
                    break

        self.srcDir = open("srcDir", "r")
        self.srcDir = self.srcDir.readline()

        self.dstDirs = open("dstDirs", "r")
        for line in self.dstDirs:
            self.dst.append(line)

    def fileHashes(self):
        self.fileHash = {}   
        for file in os.listdir(self.srcDir):
            self.fileHash[file] = os.path.getmtime(self.srcDir+file)

    def loopForever(self):
        print("Filesync Version 1.0 by pipsqueaker \n")
        while True:
            print("Iteration ", self.iteration, " @ ", datetime.now()) #APPROVE

            for destination in self.dst:
                for checkFile in os.listdir(destination):
                    if not os.path.exists(self.srcDir+checkFile):
                        os.remove(destination+checkFile)
                        print(checkFile, " removed from ", destination, " @", datetime.now())
                        self.fileHashes()

                for file in os.listdir(self.srcDir):

                    if os.path.exists(destination+file):
                        try:
                            if os.path.getmtime(self.srcDir+file) != self.fileHash[file]:
                                    try:
                                        shutil.copy2((self.srcDir+file), destination)
                                        print(file," was updated to ",destination," @",datetime.now())
                                    except:
                                        pass

                        except KeyError:
                            continue
                    else:
                        try:
                            shutil.copy2((self.srcDir+file), destination)
                            print(file, " was copied to ", destination, " @", datetime.now())
                            self.fileHashes()
                        except:
                            pass
            self.iteration += 1
            time.sleep(10)

    def main(self):
        self.initializeDirs()
        self.fileHashes()
        self.loopForever()

n = mainClass()
n.main()

You are using input() in the script:

self.IN = input()

Python 2 has raw_input() for this. input() in python 2 is the same as eval(raw_input()) . Trying to evaluate a path will sure result in a syntax error.

hello as input will result in syntax error (unless you have a variable called hello in scope). "hello" will indeed evaluate to the string "hello". just like simple expressions in python.

You may want to take a look at the 2to3 tool .

i think the problem is youre using input when you should be using raw_input

alot of people get these confused when converting programs to 2.7

in 2.7 input takes ints and raw_input will take a string or an int and turn it tinto a string

this line:

self.srcDir = input("Please input source directory \n")

should be:

 self.srcDir = raw_input("Please input source directory \n")

that should fix it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM