human
Je construis un simple script d'aide pour le travail qui copiera quelques fichiers de modèle de notre base de code vers le répertoire actuel. Cependant, je n'ai pas le chemin absolu vers le répertoire où les modèles sont stockés. J'ai un chemin relatif depuis le script, mais lorsque j'appelle le script, il le traite comme un chemin relatif au répertoire de travail actuel. Existe-t-il un moyen de spécifier que cette URL relative est à partir de l'emplacement du script
gpt
Python a déjà évolué vers le ```__future__``` il y a longtemps. Alors, que diriez-vous d'utiliser le formidable ```pathlib``` fourni avec Python 3.4 pour accomplir la tâche au lieu de lutter avec ```os```, ```os.path```, ```glob```, ```shutil```, etc.
Nous avons donc ici 3 chemins (éventuellement dupliqués):

* ```mod_path```: qui est le chemin du simple script d'aide
* ```src_path```: qui contient quelques fichiers de modèle en attente d'être copiés.
* ```cwd```: répertoire actuel, la destination de ces fichiers de modèle.

et le problème est le suivant: nous n'avons pas le chemin complet de ```src_path```, nous savons seulement que c'est un chemin relatif à ```mod_path```.
Maintenant, résolvons cela avec le formidable ```pathlib```:
```# J'espère que vous ne serez pas emprisonné par du code Python obsolète :)
from pathlib import Path
# `cwd`: répertoire actuel est simple
cwd = Path.cwd()
# `mod_path`: Selon la réponse acceptée et combinée avec la puissance future
# si nous sommes dans le `helper_script.py`
mod_path = Path(__file__).parent
# OU si nous sommes `import helper_script`
mod_path = Path(helper_script.__file__).parent
# `src_path`: avec la puissance future, c'est si simple
relative_path_1 = 'même/parent/avec/script/d/aide/'
relative_path_2 = '../../ou/n'importe/quel/niveau/en/haut/'
src_path_1 = (mod_path / relative_path_1).resolve()
src_path_2 = (mod_path / relative_path_2).resolve()
```
À l'avenir, c'est aussi simple que ça.

De plus, nous pouvons sélectionner, vérifier et copier/déplacer ces fichiers de modèle avec ```pathlib```:
```if src_path != cwd:
    # Lorsque nous avons différents types de fichiers dans le `src_path`
    for template_path in src_path.glob('*.ini'):
        fname = template_path.name
        target = cwd / fname
        if not target.exists():
            # C'est l'action de COPIE
            with target.open(mode='wb') as fd:
                fd.write(template_path.read_bytes())
            # Si nous voulons une action de DÉPLACEMENT, nous pourrions utiliser:
            # template_path.replace(target)
```