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.

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
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.

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']
},
)