Esta reseña fue evaluado por nuestros especialistas para garantizar la veracidad de nuestro tutorial.
Solución:
Tengo una situación que creo que es relativamente común. Quiero un script para importar un módulo desde otro directorio. Mi proyecto de Python se presenta de la siguiente manera:
~/project/
|
|---modules/
|
|---mod.py
|---scripts/
|---script.py
en script.py
, Yo tengo from modules import mod
. Así que mi PYTHONPATH
debe configurarse en ~/project/
(algo que PyCharm hace automáticamente).
VSCode es un gran editor, pero en cualquier otro lugar, en mi opinión, se queda corto. Este es un ejemplo perfecto de eso.
Creo un valor predeterminado launch.json
archivo para “ejecutar el archivo actual”. A "cwd": "$fileDirname"
Se debe agregar una línea para que las cosas funcionen como lo hacen en PyCharm (para su información, aquí se puede encontrar una lista de las variables integradas).
Depuración
Para depurar (el botón “reproducir” en la barra lateral o el botón F5 key), los PYTHONPATH
establecer en launch.json
o tu .env
el archivo entra en vigor. Tenga en cuenta que en el .env
archivo, no puede utilizar variables como $workspaceRoot
, pero puede agregar o insertar fácilmente en la ruta utilizando el separador adecuado para su plataforma (;
para Windows y :
para todos los demás).
Como quiero aprovechar esa variable, pongo esto en mi launch.json
:
"env": "PYTHONPATH": "$workspaceFolder:$env:PYTHONPATH"
Parece que puede anteponer / agregar a lo que sea heredado del entorno (esto no es true por settings.json
; vea abajo).
Esto también funcionará para la tecla de acceso rápido Ctrl + F5 (ejecutar sin depurar).
Como referencia, aquí está el archivo completo, que replica lo que PyCharm hace automáticamente:
"version": "0.2.0",
"configurations": [
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "$file",
"console": "integratedTerminal",
"cwd": "$fileDirname",
"env": "PYTHONPATH": "$workspaceFolder:$env:PYTHONPATH"
]
Ejecutar en terminal
Si presiono el botón “reproducir” que aparece en la parte superior derecha de la ventana del editor (cuando un archivo de Python es la pestaña activa), no funcionará. Esto ejecuta el archivo actual en una terminal, que no presta atención a launch.json
en absoluto. Para que eso funcione, tienes que definir PYTHONPATH
en un settings.json
archivo, agregando esto:
"terminal.integrated.env.osx": "PYTHONPATH": "$workspaceFolder"
(Tenga en cuenta que hay valores diferentes para cada plataforma). Si ha seleccionado un intérprete de Python (por ejemplo, de un entorno virtual), ya tendrá un settings.json
archivo en el .vscode
directorio. El mío se ve así:
"python.pythonPath": "/Users/me/project/venv/bin/python3",
"terminal.integrated.env.osx": "PYTHONPATH": "$workspaceFolder"
No puede agregar o insertar valores en el heredado PYTHONPATH
mediante el settings.json
expediente. Solo tomará uno stringy no analizará los separadores. Entonces, aunque podría obtener el valor usando $env:PYTHONPATH
, no podrás hacer nada con él.
Además, no puede configurar el directorio de trabajo actual. Aunque parezca que puede configurarlo con "terminal.integrated.cwd": "$workspaceFolder"
, no funciona. Entonces, si alguno de sus scripts hace algo con las rutas relativas a su ubicación en el árbol, no funcionará. El directorio de trabajo será la raíz de su proyecto.
Tenga en cuenta que cualquier cambio en el settings.json
El archivo requerirá que salga del terminal integrado y lo reinicie.
Linting
Nada que haga para launch.json
con respecto a PYTHONPATH
hace alguna diferencia para pylint
, que se subrayará en rojo from modules import mod
, a pesar de que puedo poner el cursor en mod
, presione F12 y el archivo se abre. Escudriñando la configuración de pelusa, los valores predeterminados para mypy
incluir --ignore-missing-imports
. Para replicar este comportamiento con pylint, agregue esto a su settings.json
:
"python.linting.pylintArgs": [
"--disable=F0401"
]
Es una pena que tengamos que solucionar esto, pero el autocompletar ayuda mucho al escribir las declaraciones de importación para empezar.
Conclusión
VSCode tiene muchas capas y es difícil hacer que las cosas funcionen juntas. Parece que hay varios entornos flotando alrededor. En el final:
- No puedo “ejecutar en la terminal” porque no puedo configurar el directorio de trabajo actual para que sea la ruta que contiene el archivo actual.
- No puedo configurar
PYTHONPATH
porpylint
ya que se ejecuta en un entorno diferente al de la terminal integrada y lo que sea controlado porlaunch.json
, entonces solo puedo decirpylint
para ignorar los errores de importación. - Ejecutar con F5 funciona si configura
PYTHONPATH
ya sea a través de un.env
archivo o enlaunch.json
OP parecía haber preguntado sobre la sintaxis de ruta para el archivo .env y la configuración de vscode para que encuentre y lea algunos archivos de módulos personalizados. Mi problema era similar en el sentido de que quería que el código encontrara mis módulos personalizados para importarlos en un script. No quería poner mis módulos personalizados en una carpeta dentro de mi entorno de Python. También quería evitar configurar una o más rutas como PYTHONPATH para las variables de usuario en las variables de entorno de Windows, pero esto funcionará si desea hacerlo. Estoy trabajando en vscode en Windows 10.
1) SINTAXIS:
a) Descubrí que la siguiente sintaxis de ruta funciona en el archivo env:
PYTHONPATH = C: / 0APPS / PYTHON / _MODULES
Mis archivos de módulo .py están en esta carpeta.
b) # funciona para comentarios en el archivo .env.
2) CONFIGURACIÓN DE VSCODE: Descubrí que lo siguiente funciona:
a) Como dijo sunew en el n. ° 2 Mi configuración: use el Explorador en vscode para abrir en la carpeta del espacio de trabajo del proyecto seleccionado. Para mí eso es Q: 420 PYTHON
b) Asigne un nombre al archivo env, como el archivo vscode.env y colóquelo en esa carpeta en el nivel superior del espacio de trabajo.
c) Abra la configuración de vscode y busque .env donde en Extensiones> Python encontrará “Python: archivo env”. Edite el cuadro para agregar su nombre de archivo env justo antes de .env. por ejemplo, $ workspaceFolder /vscode.env
d) importar custom_modulename ahora funciona para mí – en la ventana interactiva de Python y en un script.
Configurar PYTHONPATH en .env funciona para mí. Tenga en cuenta que el efecto solo es para vscode y las herramientas que ejecuta, como pylint.
Mi situación: tengo un proyecto que no es un paquete instalable pip, sino simplemente una carpeta de origen. (Por razones históricas …)
myproject/src
El proyecto tiene dependencias definidas en un archivo de requisitos pip.
Mi configuración:
- Creo un virtualenv e instalo los paquetes desde el archivo obligatorio.
- Abro vscode en la carpeta
myproject
– por lo que se convierte en la raíz del “proyecto” de vscode. - Apunto vscode para usar virtualenv como intérprete de Python. Esto hará que las importaciones de dependencias instaladas con pip funcionen. (Para linters, intellisense, etc.)
- Para también hacer que las importaciones desde la fuente de mi proyecto funcionen para los linters (especialmente pylint) en vscode, agrego un .env con este contenido, agregando la carpeta de origen de mi proyecto a PYTHONPATH:
PYTHONPATH=./src:$PYTHONPATH
Si posees alguna sospecha o forma de acrecentar nuestro división puedes escribir un comentario y con mucho placer lo ojearemos.