Nous travaillons avec un référentiel de code qui est déployé à la fois sur Windows et Linux - parfois dans des répertoires différents. Comment l'un des modules du projet doit-il faire référence à l'une des ressources non Python du projet (fichiers CSV, etc.)?
Si nous faisons quelque chose comme:
thefile=open('test.csv')
ou:
thefile=open('../somedirectory/test.csv')
Cela ne fonctionnera que lorsque le script est exécuté à partir d'un répertoire spécifique ou d'un sous-ensemble de répertoires.
Ce que je voudrais faire, c'est quelque chose comme:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
C'est possible?
python
path
relative-path
olamundo
la source
la source
__file__
), '..', '..', 'resources')os.pardir
est légèrement meilleur que'..'
, bien que les deux soient équivalents sur POSIX et Windows.Si vous utilisez des outils de configuration ou distribuez (une installation setup.py), la "bonne" façon d'accéder à ces ressources packagées semble être d'utiliser package_resources.
Dans votre cas, l'exemple serait
Lequel bien sûr lit la ressource et les données binaires lues serait la valeur de my_data
Si vous avez juste besoin du nom de fichier, vous pouvez également utiliser
Exemple:
L'avantage est qu'il est garanti de fonctionner même s'il s'agit d'une distribution d'archives comme un œuf.
Voir http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
la source
__file__
comme au bon vieux temps?En Python, les chemins sont relatifs au répertoire de travail actuel , qui dans la plupart des cas est le répertoire à partir duquel vous exécutez votre programme. Le répertoire de travail actuel est très probablement différent du répertoire de votre fichier de module, donc utiliser un chemin relatif à votre fichier de module actuel est toujours un mauvais choix.
L'utilisation d'un chemin absolu devrait être la meilleure solution:
la source
J'utilise souvent quelque chose de similaire à ceci:
La variable
contient le nom de fichier du script dans lequel vous écrivez ce code, vous pouvez donc créer des chemins relatifs au script, mais toujours écrits avec des chemins absolus. Cela fonctionne assez bien pour plusieurs raisons:
Mais vous devez surveiller la compatibilité de la plate-forme - os.pathsep de Windows est différent d'UNIX.
la source
Vous essayez également de normaliser votre
cwd
utilisationos.path.abspath(os.getcwd())
. Plus d'infos ici .la source
cwd
est le chemin d'un module, cependantVous pouvez utiliser la
__file__
variable build in . Il contient le chemin du fichier actuel. J'implémenterais getBaseOfProject dans un module à la racine de votre projet. Là, j'obtiendrais une partie du chemin__file__
et je le retournerais. Cette méthode peut ensuite être utilisée partout dans votre projet.la source
Je suis un peu perplexe ici. Je voulais regrouper certains fichiers de ressources dans un fichier de roue et y accéder. L'empaquetage a-t-il utilisé le fichier manifeste, mais pip install ne l'installait pas sauf s'il s'agissait d'un sous-répertoire. En espérant que ces photos vous aideront
MANIFEST.in
Créé un weel en utilisant setup.py standard. pip a installé le fichier de roue. Après l'installation, vérifié si les ressources sont installées. Elles sont
Dans tfclient.py pour accéder à ces fichiers. de
Et il fonctionne.
la source
J'ai passé beaucoup de temps à trouver la réponse à cela, mais je l'ai finalement eu (et c'est en fait très simple):
Cela ajoutera le chemin relatif de votre sous-dossier aux répertoires dans lesquels python pourra regarder.C'est assez rapide et sale, mais cela fonctionne comme un charme :)
la source
open('your/subfolder/of/choice')
toute façon.