我在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()
答案 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")
应该修复它