1

完全に機能するWindows上の2つのディレクトリを同期するスクリプトをpython3.3で作成しました。後で実行可能ファイルにしたかったので、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 に変換するときに、多くの人がこれらを混乱させます。

in 2.7 入力は intraw_inputを取り、文字列または int を取り、それを文字列に変換します

この行:

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

次のようにする必要があります。

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

それはそれを修正する必要があります

于 2013-05-24T02:02:19.180 に答える