环境变量PYTHONPATH
设置为C:\Users\Me
。我想在PYTHONPATH
中添加一个名为code
的文件夹,它位于与我的脚本(D:\Project
)相同的目录中。这就是我试过的:
test.py
import os
from pathlib import Path
print('BEFORE:', os.environ['PYTHONPATH'])
folder = Path(__file__).resolve().parent.joinpath('code')
print('FOLDER:', folder)
os.system(f'set PYTHONPATH={folder};%PYTHONPATH%')
print('AFTER:', os.environ['PYTHONPATH'])
样本运行:
D:\Project> dir /ad /b
code
D:\Project> dir *.py /b
test.py
D:\Project> python test.py
BEFORE: C:\Users\Me
FOLDER: D:\Project\code
AFTER: C:\Users\Me <<< should be D:\Project\code;C:\Users\Me
我也试过这个:
import subprocess
subprocess.run(["set", f"PYTHONPATH={folder};%PYTHONPATH%"])
这就是我得到的:
FileNotFoundError: [WinError 2] The system cannot find the file specified
如何以编程方式将文件夹添加到PYTHONPATH
?我只想更改系统环境变量以执行当前脚本。
发布于 2021-09-27 00:16:55
如果您只想为了执行当前脚本而更改它,则只需在os.environ
映射中分配(或更改现有的)值即可。下面的代码有点复杂,因为我让它工作了,即使os.environ[PYTHONPATH]
最初没有设置为任何东西(就像我自己的系统上的情况一样)。
import os
from pathlib import Path
PYTHONPATH = 'PYTHONPATH'
try:
pythonpath = os.environ[PYTHONPATH]
except KeyError:
pythonpath = ''
print('BEFORE:', pythonpath)
folder = Path(__file__).resolve().parent.joinpath('code')
print(f'{folder=}')
pathlist = [str(folder)]
if pythonpath:
pathlist.extend(pythonpath.split(os.pathsep))
print(f'{pathlist=}')
os.environ[PYTHONPATH] = os.pathsep.join(pathlist)
print('AFTER:', os.environ[PYTHONPATH])
发布于 2021-09-26 23:01:31
sys.path
和os.environ
都会设置您想要的东西。你只是错过了两件事:
os.system
在一个新的子subshell中执行,因此您的进程不受env的影响。它在子壳中受到影响,然后退出。C:\> set PYTHONPATH=hello; python
>>> from os import environ
>>> environ["PYTHONPATH"]
'hello'
>>> environ["PYTHONPATH"] = environ["PYTHONPATH"] + ";world"
>>> environ["PYTHONPATH"]
'hello;world'
>>>
C:\> echo %PYTHONPATH%
# empty or "%PYTHONPATH%" string
为了保存值,您需要使用,即shell,它是操纵环境的东西。例如,使用export
(或Windows上的set
):
set PYTHONPATH=hello
echo %PYTHONPATH%
# hello
python -c "print('set PYTHONPATH=%PYTHONPATH%;world')" > out.bat
out.bat
echo %PYTHONPATH%
# hello;world
或者,利用subprocess.Popen(["command"], env={"PYTHONPATH": environ["PYTHONPATH"] + <separator> + new path})
,这将基本上打开一个新的进程-也就是说,您可以为其他程序创建一个Python,并以这种方式为其准备环境。它中的环境将受到影响,但是外部环境仍然不需要从shell的进程上下文而不是从子进程(python进程)访问shell。
示例:
# launcher.py
from subprocess import Popen
Popen(["python", "-c", "import os;print(os.environ.get('PYTHONPATH'))"])
Popen(
["python", "-c", "import os;print(os.environ.get('PYTHONPATH'))"],
env={"PYTHONPATH": "hello"}
)
发布于 2021-09-26 22:48:00
我认为sys.path.append(...)
应该能工作。不要忘记导入sys
。
https://stackoverflow.com/questions/69339527
复制相似问题