2013-06-06 56 views
2

我是passtime程序员,所以请温和。现在对于实际的问题,我的一个用户遇到了这种奇怪的行为,其中os.path.join(p1,p2)返回一个相对路径,并且从p1中省略了所有斜线。像这样(假装这是Python CMD行解释器中完成):os.path.join(p1,p2)省略了p1的斜杠

>>import os 
>>p1 = "/Some/Path/Tosmth" 
>>p2 = "file.ext" 
>>print os.path.join(p1,p2)` 

然后输出为:

>>"SomePathTosmth/file.ext" 

就在连接操作我检查P1和P2的内容,它是正是我所期望的。这是有问题的实际执行有一些额外的调试代码:

def __moveMovie(self, src, dst, folder, file_name): 
    try: 
     self.logDebug('__moveMovie(): src=%s | dst=%s | folder=%s | file_name=%s' % (src, dst, folder, file_name)) 
     dest = save_path(dst) 
     file_name = save_path(file_name) 
     if self.getConfig("subfolder") is True: 
      dest = os.path.join(dst,folder) 
      os.mkdir(Utils().encode(dest)) 
    except OSError, e: 
     if e.args[0] == 17: 
      self.logDebug(u'Cannot create folder "%s". It already exists.' % os.path.join(dest)) 
    try: 
     full_dst = Utils().encode(os.path.join(dest,file_name)) 
     self.logDebug('var "full_dst" w/o encode: %s' % os.path.join(dest, file_name)) 
     self.logDebug('var "full_dst" w/ encode: %s' % Utils().encode(os.path.join(dest,file_name))) 
     if os.path.exists(full_dst): 
      pass 
     shutil.move(src, full_dst) 
     self.logInfo(u'Movie "%s" moved to "%s"' % (os.path.split(src)[1], os.path.join(dest,file_name))) 
     self.__movie_queue.task_done() 
    except OSError, e: 
     if e.args[0] == 21: 
      self.logDebug(u'Cannot move "%s" to "%s". "%s" is a directory.' % (os.path.split(src)[1], 
                       os.path.join(dest, file_name), 
                       os.path.join(dest, file_name))) 
      self.__movie_queue.task_done() 

这是日志代码:

05.06.2013 17:29:12 DEBUG  MovieMover: __moveMovie(): src=/var/raid/Daten/Neu/abgezockt.tc.72-ps/Voll.Abgezockt.2013.UNRATED.GERMAN.AC3LD.5.1.DL.720p.BluRay.x264-DerSchuft.mkv | dst=/var/raid/Daten/Filme | folder=Voll.Abgezockt.2013.UNRATED.GERMAN.AC3LD.5.1.DL.720p.BluRay.x264-DerSchuft | file_name=Voll Abgezockt.mkv 
05.06.2013 17:29:12 DEBUG  MovieMover: var "full_dst" w/o encode: varraidDatenFilme/Voll Abgezockt.mkv 
05.06.2013 17:29:12 DEBUG  MovieMover: var "full_dst" w/ encode: varraidDatenFilme/Voll Abgezockt.mkv 
05.06.2013 17:29:12 DEBUG  MovieMover: __moveMovie(): src=/var/raid/Daten/Neu/abgezockt.tc.72-ps/.AppleDouble/Voll.Abgezockt.2013.UNRATED.GERMAN.AC3LD.5.1.DL.720p.BluRay.x264-DerSchuft.mkv | dst=/var/raid/Daten/Filme | folder=Voll.Abgezockt.2013.UNRATED.GERMAN.AC3LD.5.1.DL.720p.BluRay.x264-DerSchuft | file_name=Voll Abgezockt.mkv 
05.06.2013 17:29:12 DEBUG  MovieMover: var "full_dst" w/o encode: varraidDatenFilme/Voll Abgezockt.mkv 
05.06.2013 17:29:12 DEBUG  MovieMover: var "full_dst" w/ encode: varraidDatenFilme/Voll Abgezockt.mkv 
Exception in thread Thread-1072: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 505, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/var/local/pyload/userplugins/hooks/MovieMover.py", line 360, in __getMvQueue 
    self.__moveMovie(src, dst, movie.folder_name, movie.file_name) 
    File "/var/local/pyload/userplugins/hooks/MovieMover.py", line 382, in __moveMovie 
    shutil.move(src, full_dst) 
    File "/usr/lib/python2.7/shutil.py", line 301, in move 
    copy2(src, real_dst) 
    File "/usr/lib/python2.7/shutil.py", line 130, in copy2 
    copyfile(src, dst) 
    File "/usr/lib/python2.7/shutil.py", line 83, in copyfile 
    with open(dst, 'wb') as fdst: 
IOError: [Errno 2] No such file or directory: u'varraidDatenFilme/Voll Abgezockt.mkv' 

Exception in thread Thread-1074: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 505, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/var/local/pyload/userplugins/hooks/MovieMover.py", line 360, in __getMvQueue 
    self.__moveMovie(src, dst, movie.folder_name, movie.file_name) 
    File "/var/local/pyload/userplugins/hooks/MovieMover.py", line 382, in __moveMovie 
    shutil.move(src, full_dst) 
    File "/usr/lib/python2.7/shutil.py", line 301, in move 
    copy2(src, real_dst) 
    File "/usr/lib/python2.7/shutil.py", line 130, in copy2 
    copyfile(src, dst) 
    File "/usr/lib/python2.7/shutil.py", line 83, in copyfile 
    with open(dst, 'wb') as fdst: 
IOError: [Errno 2] No such file or directory: u'varraidDatenFilme/Voll Abgezockt.mkv' 

我是因为编码功能完全丧失封闭os.path中.join()函数不是原因,当他用他的python cmd行解释器执行os.path.join()时,结果是正确的。如果有任何兴趣的话,我在2.7上执行代码时写入了2.5。我希望有人能够阐明这一点。谢谢!

因为它似乎我不能使用代码中的注释格式在这里我要回答这些:

这是的save_path()函数:

def save_path(name): 
    #remove some chars 
    if os.name == 'nt': 
     return remove_chars(name, '/\\?%*:|"<>') 
    else: 
     return remove_chars(name, '/\\"') 

这就是现在我必须补充不我的代码。我正在写一个名为pyLoad的开源项目。只是想确保我没有声称任何东西是我的代码,但事实并非如此。

编辑:布伦丹朗的答案似乎是准确的。在我的开发环境中,self.getConfig("subfolder")处于开启状态,同时显示它不是我的用户。有了这个,我可以成功地重现错误。我会释放该修复程序,并让有问题的用户确认它的工作原理,但到目前为止,它都指向save_path是罪魁祸首。也觉得有点像一个白痴俯视明显,真的。无论如何,谢谢,我会回来给你结果。

+3

什么是'save_path'? –

+0

我将它添加到实际问题中。 –

+0

第一部分在2.7工作正常 – Serial

回答

5

看着save_path

if os.name == 'nt': 
    return remove_chars(name, '/\\?%*:|"<>') 
else: 
    return remove_chars(name, '/\\"') 

此功能删除/的(和一对夫妇在文件名中的特殊含义其他东西)。所以..这就是为什么斜杠被删除。

我猜这个函数是为了清理用户上传文件的文件名(所以他们不能上传一个名为../../../etc/passwd的文件)。如果没有必要,那么解决方案就是忽略对这个函数的调用。

+0

是的,这一定是它。由于它在我的开发环境中执行得很好,所以我确信这个错误正在进一步发展,我没有在save_path上付出过多的关注。不知道为什么我首先使用它。也只是成功地转载它自己。 “self.getConfig(”子文件夹“)”已打开/对我来说为True,但显然不适合我的用户。谢谢你的协助。我觉得有点像一个白痴俯视明显。 –

相关问题