Je suis en train de faire des tutoriels d'apprentissage sur Python sur Lynda. Le tutoriel a le script créant les fichiers dans le même répertoire que le script, comme on pouvait s'y attendre.
Pour une raison quelconque, cependant, mon installation crée le fichier et cherche à lire le fichier (en utilisant l'objet chemin) dans le racine du projet, ou deux répertoires en haut.
Le script que j'exécute est C: \ Users \ user \ Development \ Ex_Files_Learning_Python \ Exercise Files \ Ch4
Le script ressemble à ceci:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File (Integrated Terminal)",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"port": 5678,
"host": "localhost",
"pathMappings": [
{
"localRoot": ".",
"remoteRoot": "."
}
]
},
{
"name": "Python: Module",
"type": "python",
"request": "launch",
"module": "enter-your-module-name-here",
"console": "integratedTerminal"
},
{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"console": "integratedTerminal",
"args": [
"runserver",
"--noreload",
"--nothreading"
],
"django": true
},
{
"name": "Python: Flask",
"type": "python",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "app.py"
},
"args": [
"run",
"--no-debugger",
"--no-reload"
],
"jinja": true
},
{
"name": "Python: Current File (External Terminal)",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "externalTerminal"
}
]
}
Sa sortie est
nt
Item exists: False
Item is a file: False
Item is a directory: False
Item pathC:\Users\user\Development\Ex_Files_Learning_Python\textfile.txt
Item path and name: ('C:\\Users\\user\\Development\\Ex_Files_Learning_Python', 'textfile.txt')
Donc, comme vous pouvez le voir, il suppose que son chemin est la racine du projet, deux répertoires vers le haut. J'ai eu le même problème dans mon exercice précédent, la création d'un fichier. Lorsque j'utilisais open () sur un objet fichier, cela créait le fichier deux répertoires plus haut à la racine du projet.
Tous les pointeurs sont appréciés.
Mise à jour: j'ai établi que cela se produit parce que j'utilise le terminal VSCode. Comment demander au terminal VSCode d'exécuter le programme à partir du cwd du fichier que je suis en train d'éditer et de déboguer, plutôt qu'à la racine du projet?
Pour mémoire, voici mon launch.json pour le débogueur
import os
from os import path
import datetime
from datetime import date, time, timedelta
import time
def main():
# Print the name of the OS
print(os.name)
# Check for item existence and type
print("Item exists: " + str(path.exists("textfile.txt")))
print("Item is a file: " + str(path.isfile("textfile.txt")))
print("Item is a directory: " + str(path.isdir("textfile.txt")))
# Work with file paths
print("Item path" + str(path.realpath("textfile.txt")))
print("Item path and name: " + str(path.split(path.realpath("textfile.txt"))))
# Get the modification time
# Calculate how long ago the item was modified
if __name__ == "__main__":
main()
4 Réponses :
Si vous exécutez le script à partir du terminal, vous exécutez probablement:
cd "Exercise Files\Ch4" python my_script.py
Ou quelque chose de similaire.
Au lieu de cela, changez de dossier d'abord, puis exécutez sur le terminal:
python "Exercise Files\Ch4\my_script.py"
Ou, pour éviter tout ce changement manuel de répertoire, changez explicitement le répertoire de travail dans votre script.
J'ai établi que cela se produit parce que j'utilise le terminal VSCode. Comment demander au terminal VSCode d'exécuter le programme à partir du cwd du fichier que je modifie et débogue, plutôt que de la racine du projet?
Mieux vaut spécifier explicitement le chemin du fichier :)
Vous dites que "cela se produit parce que j'utilise le terminal VSCode", mais vous ne nous dites pas ce que vous faites exactement. Ma suggestion était que vous démarriez probablement vous-même Python à partir de ce répertoire de travail, c'est pourquoi votre script s'y trouve. Pour plus d'informations sur la configuration d'un environnement de script Python avec VSCode, consultez code.visualstudio. com / docs / python / python-tutorial
@Grismar Je vous disais que vous avez raison. Le terminal lance le script depuis la racine du projet. Cela signifie que je dois maintenant le faire fonctionner à partir du cwd du fichier. Merci pour cette documentation. Je suppose que je vais le lire et poster toute réponse que je trouve comme ma propre réponse.
Je suis désolé, mais il n'y avait aucune infraction implicite et je n'aime pas être accusé de gaslighting lorsque je réponds à une question. Je vous suggère de bien vouloir relire ce qui précède pour confirmer que votre accusation était injustifiée.
Selon https://code.visualstudio.com/docs/python/settings -référence :
python.terminal.executeInFileDir
faux
Indique s'il faut exécuter un fichier dans le répertoire du fichier au lieu du dossier actuel.
Il suffit donc de définir python.terminal.executeInFileDir sur true .
Je me rends compte maintenant que cela affecte la fenêtre du terminal, mais pas le débogueur. Votre réponse est correcte, mais je vais mettre à jour avec une autre réponse sur la modification du débogueur.
C'est ma faute, car je n'ai pas précisé que j'essayais de modifier le terminal de débogage dans VSCode. La réponse de @Adam Smith est correcte pour la majorité des cas traitant du terminal standard.
Si, cependant, vous essayez d'exécuter le fichier à partir du débogueur, la réponse est de définir "cwd" sur une chaîne vide, c'est-à-dire "" dans launch.json (configuration actuelle du débogueur)
Ce que vous devez utiliser est la variable intégrée __file__ que Python associe au nom de fichier Python actuel.
voir que signifie / fait la variable __file__?
pathlib.Path est sur Python 3 et sert à manipuler les chemins de fichiers.
#from pathlib import Path
myfilepath = os.path.join(os.path.dirname(__file__), "textfile.txt")
^ get parent directory
^ append your filename
et ceci le script
posix
Item exists: True
Item is a file: True
Item is a directory: False
Item path/Users/jluc/kds2/wk/explore/textfile.txt
Item path and name: ('/Users/jluc/kds2/wk/explore', 'textfile.txt')
si vous êtes dans
C: \ users \ user \ Development \ Ex_Files_Learning_Pythonet que vous faitespython "Exercise Files \ Ch4.py", vous obtiendrez ce comportement. Vous pouvez redémarrer le fichier Python si vous le souhaitez:os.chdir (__ file__)Merci, voir ma mise à jour @AdamSmith C'est le terminal VSCode qui est par défaut dans le répertoire racine. Essayer maintenant de trouver comment résoudre ce problème. Sur une autre note, je pourrais me tromper parce que je ne l'ai pas essayé, mais votre solution de contournement de la réinitialisation n'échouerait-elle pas parce qu'elle utilise une tentative de changer de répertoire en chemin de fichier, plutôt qu'en répertoire?
Oh ouais ça le ferait totalement.
os.chdir (os.path.dirname (__ file__))puis :). Il existe un moyen de modifier ces paramètres dansvscode, mais cela dépend de la façon dont vous avez chargé le fichier (fait-il partie d'un projet, etc.)@AdamSmith Je l'ai ouvert dans le cadre d'un projet. J'ai ouvert le répertoire, puis ouvrez les fichiers du projet depuis la barre latérale.