Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从zip文件中提取.app_Python_Macos_Zip_Extract_.app - Fatal编程技术网

在Python中从zip文件中提取.app

在Python中从zip文件中提取.app,python,macos,zip,extract,.app,Python,Macos,Zip,Extract,.app,(Python 2.7) 我有一个程序可以从服务器下载一个.zip文件,其中包含一个我想运行的.app文件。zip可以从服务器上很好地下载,并且尝试在Python之外提取它也可以。然而,当我试图从Python中提取zip时,.app没有运行——它没有说文件已损坏或损坏,它根本不会启动。我曾在其他.app文件中尝试过这个方法,但我也遇到了同样的问题,我想知道以前是否有其他人遇到过这个问题,以及解决这个问题的方法 我正在使用的代码: for a in gArchives: if (a['fname'

(Python 2.7)

我有一个程序可以从服务器下载一个.zip文件,其中包含一个我想运行的.app文件。zip可以从服务器上很好地下载,并且尝试在Python之外提取它也可以。然而,当我试图从Python中提取zip时,.app没有运行——它没有说文件已损坏或损坏,它根本不会启动。我曾在其他.app文件中尝试过这个方法,但我也遇到了同样的问题,我想知道以前是否有其他人遇到过这个问题,以及解决这个问题的方法

我正在使用的代码:

for a in gArchives:
if (a['fname'].endswith(".build.zip") or a['fname'].endswith(".patch.zip")): 
    #try to extract: if not, delete corrupted zip
    try :
        zip_file = zipfile.ZipFile(a['fname'], 'r')
    except:
        os.remove(a['fname'])
    for files in zip_file.namelist() :
        #deletes local files in the zip that already exist
        if os.path.exists(files) :
            try :
                os.remove(files)
            except:
                print("Cannot remove file")
            try :
                shutil.rmtree(files)
            except:
                print("Cannot remove directory")
        try :
            zip_file.extract(files)
        except:
            print("Extract failed")                        
    zip_file.close()

我也尝试过使用zip_file.extractall(),但我也遇到了同样的问题。

在我的macbook pro上测试时,问题似乎在于Python提取文件的方式

如果你跑

diff -r python_extracted_zip normal_extracted_zip
您将收到如下消息:

File Seashore.app/Contents/Frameworks/TIFF.framework/Resources is a directory while file here/Seashore.app/Contents/Frameworks/TIFF.framework/Resources is a regular file
所以很明显,问题在于它在提取文件名时遇到的文件名。在提取文件名时,需要对其进行一些检查


编辑:这似乎是Python2.7中的一个bug。*正如所发现的-来源于发布的另一个问题。

我自己设法解决了这个问题-问题不在于没有正确提取目录,而在于上面提到的权限

当使用Python提取文件时,权限没有保留在.zip中,因此所有可执行文件都被设置为不可执行。通过对我提取的所有文件调用以下命令解决了此问题,其中“path”是文件的路径:

os.chmod(path, 0755)

我想这可能是一个bug…我想除了更新到Python3之外,绝对没有其他解决方法了?不一定,osx版本是2.7.2,我相信,但最新的2.7系列是2.7.5,所以你可以改为更新到2.7.5。哪个最适合你。顺便说一句,请随意将我的回答标记为答案,因为它将在遇到类似问题的其他人面前脱颖而出。