Bonjour,
J'ai un problème avec l'installation d'un package que je dois maintenir. Le fichier setup.py a été rédigé par quelqu'un d'autre et je suis pas très avancé en Python.
Le problème survient quand les fichiers à installer sont en lecture seule. Le code du fichier setup.py retire l'attribut lecture seule des fichiers correctement, mais le fichier généré par l'installation "package-cmd.py" demeure en lecture seule.
La première fois que l'on éxécute l'installation, cela fonctionne, mais une erreur survient lorsqu'il tente d'effacer le contenu du répertoire build, puisque le fichier build\bdist.win32\egg\EGG-INFO\scripts\package-cmd.py est en lecture seule.
Si on tente de réinstaller le package un jour (parce qu'on l'a désinstallé ou autre raison) alors que le dossier "build" est présent (d'une installaton précédente), l'installation échoue complètement en donnant l'erreur : "error: could not delete 'build\scripts-2.7\package-cmd.py': Access is denied". Il n'a pas pu remplacer le fichier car il est en lecture seule.creating 'dist\package-1.2.4-py2.7.egg' and adding 'build\bdist.win32\egg' to it
removing 'build\bdist.win32\egg' (and everything under it)
error removing build\bdist.win32\egg: build\bdist.win32\egg\EGG-INFO\scripts\package-cmd.py: Access is denied
error removing build\bdist.win32\egg: build\bdist.win32\egg\EGG-INFO\scripts: The directory is not empty
error removing build\bdist.win32\egg: build\bdist.win32\egg\EGG-INFO: The directory is not empty
error removing build\bdist.win32\egg: build\bdist.win32\egg: The directory is not empty
Idéalement, j'aimerais que le setup.py me génère un fichier package-cmd.py qui n'est pas en lecture seule. Retirer l'attribut "lecture seule" sur les fichiers originaux d'installation fonctionne, mais ce n'est pas une option, puisque cet attribut est géré par une instance Perforce.
Voici le code du setup.py. Est-ce qu'il y a quelque chose que je peux modifier pour modifier l'attribut lecture seule du fichier généré?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 from setuptools import setup from distutils.command.install import INSTALL_SCHEMES from distutils.command.install_data import install_data as _install_data import os import sys # remove read-only from data files class install_data(_install_data): def copy_file(self, infile, outfile, preserve_mode=0, preserve_times=1, link=None, level=1): return _install_data.copy_file(self,infile, outfile, preserve_mode=0, preserve_times=1, link=None, level=1) def fullsplit(path, result=None): """ Split a pathname into components (the opposite of os.path.join) in a platform-neutral way. """ if result is None: result = [] head, tail = os.path.split(path) if head == '': return [tail] + result if head == path: return result return fullsplit(head, [tail] + result) # Tell distutils to put the data_files in platform-specific installation # locations. See here for an explanation: # for scheme in INSTALL_SCHEMES.values(): scheme['data'] = scheme['purelib'] # Compile the list of packages available, because distutils doesn't have # an easy way to do this. packages, data_files = [], [] root_dir = os.path.dirname(__file__) if root_dir != '': os.chdir(root_dir) tool_dir = 'package_name' # install for dirpath, dirnames, filenames in os.walk(tool_dir): # Ignore dirnames that start with '.' for i, dirname in enumerate(dirnames): if dirname.startswith('.'): del dirnames[i] if '__init__.py' in filenames: packages.append('.'.join(fullsplit(dirpath))) for f in filenames: if not f.endswith('.py'): data_files.append([dirpath, [os.path.join(dirpath,f)]]) elif filenames: data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]]) #setup setup( name = "Package_name", version = '1.2.4', cmdclass = { 'install_data' : install_data, }, packages = packages, data_files = data_files, scripts = ['scripts/package-cmd.py'], entry_points = { 'console_scripts' : ['package = package:execute_from_command_line'] }, )
Partager