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.