首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >以编程方式将文件夹添加到PYTHONPATH

以编程方式将文件夹添加到PYTHONPATH
EN

Stack Overflow用户
提问于 2021-09-26 22:44:42
回答 3查看 1.5K关注 0票数 0

环境变量PYTHONPATH设置为C:\Users\Me。我想在PYTHONPATH中添加一个名为code的文件夹,它位于与我的脚本(D:\Project)相同的目录中。这就是我试过的:

test.py

代码语言:javascript
代码运行次数:0
运行
复制
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'])

样本运行:

代码语言:javascript
代码运行次数:0
运行
复制
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

我也试过这个:

代码语言:javascript
代码运行次数:0
运行
复制
import subprocess
subprocess.run(["set", f"PYTHONPATH={folder};%PYTHONPATH%"])

这就是我得到的:

代码语言:javascript
代码运行次数:0
运行
复制
FileNotFoundError: [WinError 2] The system cannot find the file specified

如何以编程方式将文件夹添加到PYTHONPATH?我只想更改系统环境变量以执行当前脚本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-27 00:16:55

如果您只想为了执行当前脚本而更改它,则只需在os.environ映射中分配(或更改现有的)值即可。下面的代码有点复杂,因为我让它工作了,即使os.environ[PYTHONPATH] 最初没有设置为任何东西(就像我自己的系统上的情况一样)。

代码语言:javascript
代码运行次数:0
运行
复制
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])
票数 3
EN

Stack Overflow用户

发布于 2021-09-26 23:01:31

sys.pathos.environ都会设置您想要的东西。你只是错过了两件事:

  • 每个进程设置一个环境变量,因此,除非进程结束,否则不能从进程外部访问环境变量。
  • os.system在一个新的子subshell中执行,因此您的进程不受env的影响。它在子壳中受到影响,然后退出。
代码语言:javascript
代码运行次数:0
运行
复制
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 ):

代码语言:javascript
代码运行次数:0
运行
复制
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。

更多关于这里这里的信息。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
# 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"}
)
票数 1
EN

Stack Overflow用户

发布于 2021-09-26 22:48:00

我认为sys.path.append(...)应该能工作。不要忘记导入sys

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69339527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档