1

我在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 下运行良好(我应该添加相同的路径),这让我相信 2.7 在幕后发生了一些奇怪的事情。

谁能向我解释为什么会发生这种情况以及如何解决?

这也是程序的来源,虽然我觉得这并不重要

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

2 回答 2

3

input()在脚本中使用:

self.IN = input()

Python 2 可以做到raw_input()这一点。input()在 python 2 中与eval(raw_input()). 尝试评估路径肯定会导致语法错误。

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

您可能想看看2to3 工具

于 2013-05-24T02:01:28.513 回答
1

我认为问题出input在你应该使用的时候使用raw_input

很多人在将程序转换为 2.7 时会感到困惑

在 2.7 中,输入采用整数raw_input并将采用字符串或整数并将其转换为字符串

这一行:

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

应该:

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

那应该解决它

于 2013-05-24T02:02:19.180 回答