1
votes

Comment changer par programme "/test/unit/python/tests.py" en "test.unit.python.tests" dans Bash?

Il y a de nombreux fichiers python dans le répertoire test .

$ echo $file    ===> /test/unit/python/tests.py
$ '${file.???}' ===> How can I get test.unit.python.tests 
                =>              or test.unit.python.tests.py

Je veux d'une manière ou d'une autre appeler tous les scripts Python pour les tests unitaires.

python -m unittest test.unit.python.tests

Comment sous-chaîne par programmation "/test/unit/python/tests.py" en "test.unit.python .tests "dans Bash?

file="test/unit/python/tests.py"


1 commentaires

Cela ressemble à un problème X-Y. Ce que vous voulez vraiment, c'est tester la découverte , en utilisant python -m unittest découvrir , non?


3 Réponses :


0
votes

Vous pouvez utiliser sed:

python -m unittest $(echo $file | sed 's/\//\./g' | sed 's/\.py//g')

Utiliser avec python (supprimé également le .py ):

XXX


7 commentaires

Wow, c'est un code extraterrestre génial. Uhm Comment puis-je l'utiliser pour appeler depuis python -m unittest test.unit.python.tests


@alfasin: Dans ce cas particulier, vous pourriez affirmer qu'il est techniquement sûr de permettre à $ file de subir le fractionnement de mots et l'expansion globale, car en théorie, il ne devrait jamais contenir de caractères qui ne sont pas également valides dans un identifiant Python, mais il serait plus sûr de le citer pour éviter une éventuelle mauvaise interprétation par le shell.


@DanielPryden Peu importe si ce sont des identifiants Python valides, n'est-ce pas? S'ils se développent, ils génèrent des fichiers qui n'existent pas nécessairement.


Notez que cela ne supprime pas le .py (j'ai commis cette erreur moi-même), et si tout ce que vous faites est de remplacer un caractère spécifique, vous pouvez utiliser y | / |. | au lieu de s /// g .


@BenjaminW: Si l'expansion globale réussit, alors par définition, les fichiers existent . Comme je l'ai dit, je ne pense pas que ce soit dangereux ici mais ce n'est pas une bonne pratique ni sûre à recommander en général.


@DanielPryden D'accord - mais les noms de fichiers avec des blancs briseraient les choses.


@BenjaminW .: Les noms de fichiers avec des blancs cassent déjà les choses (puisque le chemin en pointillé résultant n'est pas valide en Python). Mais si vous laissez les caractères d'espacement provoquer la division des mots, vous obtenez des chemins partiels, et je parie que si vous aviez un fichier nommé par exemple. --cgi 8000 http.server somethingelse.py (ou similaire) vous pourriez lui faire faire quelque chose de désagréable.



1
votes

Voici une implémentation en pure Bash:

file='path/to/module.py'
python -m unittest "$(python_path_to_dotted "$file")"

Déclarez cette fonction, puis vous pouvez faire quelque chose comme:

python_path_to_dotted() {
  if [[ "$1" == *.py ]]; then
    return 1
  fi
  IFS='/' read -a pypath_parts <<< "$1"
  pypath_dotted="$(printf '%s.' "${pypath_parts[@]}")"
  printf '%s\n' "${pypath_dotted%%.py.}"
}


0 commentaires

2
votes

Utiliser l'expansion des paramètres:

$ file='test/unit/python/tests.py'
$ basename=${file%.py}               # basename is test/unit/python/tests
$ printf '%s\n' "${basename//\//.}"  # replaces all "/" with "."
test.unit.python.tests


3 commentaires

Cela ne fonctionnera pas car vous devez également supprimer l'extension .py . Mais utiliser un remplacement de caractère comme celui-ci est probablement mieux que ma solution utilisant IFS.


@DanielPryden Oh, d'accord, l'extension doit également être supprimée, laissez-moi mettre à jour ...


Vous êtes les meilleurs les gars.