Python 2.7给了我莫名其妙的“语法错误”

时间:2013-05-24 01:58:03

标签: python string python-2.7 syntax

我在python3.3中编写了一个脚本来同步Windows上的两个目录,这些目录完美无缺;后来我想把它变成一个可执行文件,所以我把它移植到python 2.7(cx_freeze给我“模块未找到”错误)。我遇到了这个奇怪的问题,这就是每当我输入一个文件路径到我的程序时它会给我一个错误;例如,如果我输入“C:\ Users \ Me \ SourceDir”,程序会中断,输出

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

我很困惑为什么会这样。该程序在python3.3下运行正常(我应该添加相同的路径),这让我相信在幕后有一些奇怪的东西。

任何人都可以向我解释为什么会发生这种情况以及如何解决这个问题?

这里也是该节目的来源,虽然我觉得这不重要

    '''
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()

2 个答案:

答案 0 :(得分:3)

您在脚本中使用input()

self.IN = input()

Python 2有raw_input()。 python 2中的input()eval(raw_input())相同。尝试评估路径肯定会导致语法错误。

输入

hello将导致语法错误(除非您在范围内有一个名为hello的变量)。 "hello"确实会评估字符串“hello”。就像python中的简单表达式一样。

您可能需要查看2to3 tool

答案 1 :(得分:1)

我认为当您使用input

时问题是您正在使用raw_input 很多人在将程序转换为2.7

时会感到困惑

在2.7输入中占用整数,raw_input将取一个字符串或一个int并将其转换成一个字符串

这一行:

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

应该是:

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

应该修复它