PYTHONPATH 未从 CMD 传播到 Spyder

PYTHONPATH not propagating from CMD to Spyder

提问人:user2153235 提问时间:9/1/2023 最后编辑:user2153235 更新时间:9/15/2023 访问量:195

问:

我通过发出以下命令在 Anaconda 下安装了 PySpark 在 Conda 提示符下:

conda create -n py39 python=3.9 anaconda
conda activate py39
conda install openjdk
conda install pyspark
conda install -c conda-forge findspark

可以看出,这一切都在环境中。 此外,我从 GitHub 获取了 Hadoop 2.7.1 并创建以包含相应的文件和子文件夹 [1]。这里,是.最后,我必须创建文件(附件 A)。py39c:%HOMEPATH%\AppData\Local\Hadoop\2.7.1README.mdbin%HOMEPATH%\Users\User.Name%SPARK_HOME%/conf/spark-defaults.conf

通过上述设置,我可以使用以下脚本启动 PySpark:myspark.cmdc:%HOMEPATH%\anaconda3\envs\py39\bin\

set "PYSPARK_DRIVER_PYTHON=python"
set "PYSPARK_PYTHON=python"
set "HADOOP_HOME=c:%HOMEPATH%\AppData\Local\Hadoop\2.7.1"
pyspark

我现在正在关注这个 页面,以便能够使用 Spyder 而不是 Conda 命令行。我是 使用以下脚本设置变量 并启动Spyder:SpyderSpark.cmd

set "HADOOP_HOME=c:%HOMEPATH%\AppData\Local\Hadoop\2.7.1"
set "JAVA_HOME=C:%HOMEPATH%\anaconda3\envs\py39\Library"
set "SPARK_HOME=C:%HOMEPATH%\anaconda3\envs\py39\lib\site-packages\pyspark"
set "PYSPARK_DRIVER_PYTHON=Python"
set "PYSPARK_PYTHON=Python"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;%PYTHONPATH%"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python;%PYTHONPATH%"

C:%HOMEPATH%\anaconda3\pythonw.exe ^
C:%HOMEPATH%\anaconda3\cwp.py ^
C:%HOMEPATH%\anaconda3\envs\py39 ^
C:%HOMEPATH%\anaconda3\envs\py39\pythonw.exe ^
C:%HOMEPATH%\anaconda3\envs\py39\Scripts\spyder-script.py

一些可能不清楚的要点:

  • 文件夹包含和%JAVA_HOME%\binjava.exejavac.exe

  • 上面代码块的后半部分是命令 由 Anaconda 的快捷方式执行Spyder (py39)

当我还在努力开始工作时,我执行了它 从 Conda 提示符,特别是环境。这边 它继承了我可能遗漏的环境变量。发行启动Spyder GUI, 但在控制台上无法识别 Spark 命令。这是一个 对前几行代码的响应的脚本 教程SpyderSpark.cmdpy39SpyderSpark.cmdSpyderSpark.cmd

In [1]: columns = ["language","users_count"]
   ...: data = [("Java", "20000"), ("Python", "100000"), ("Scala", "3000")]
In [2]: spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()
NameError: name 'SparkSession' is not defined

可能的原因是,除了变量之外,所有变量都传播了 他们的值进入 Spyder 会话。从Spyder控制台:PYTHONPATH

import os
print(os.environ.get("HADOOP_HOME"))
print(os.environ.get("JAVA_HOME"))
print(os.environ.get("SPARK_HOME"))
print(os.environ.get("PYSPARK_DRIVER_PYTHON"))
print(os.environ.get("PYSPARK_PYTHON"))
print(os.environ.get("PYTHONPATH"))

   c:\Users\User.Name\AppData\Local\Hadoop\2.7.1
   C:\Users\User.Name\anaconda3\envs\py39\Library
   C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark
   Python
   Python
   None

为什么 PYTHONPATH 没有传播到 Spyder 会话中,以及如何传播 我可以解决这个问题吗?

我不认为这 Q&A 解释了 问题,因为我设置变量从 CMD 环境启动 Spyder。此外,所有其他变量都成功 传播到 Spyder 会话。

笔记

[1] 使用 Cygwin,我发现对于 中的所有文件,权限位 执行已禁用,需要显式启用。c:%HOMEPATH%\AppData\Local\Hadoop\2.7.1\bin

后记 2023-09-02:

受访者发布了有关如何获取 Spark 命令的有用提示 在 Spyder 中识别,即第一个问题。我没有看到这个教程代码,因为它在屏幕截图中,并且图像被 AdBlocker 阻止了。此外,从环境的 Conda 提示发出后不需要它。正如我从评论中发现的那样,发布后需要它,这允许识别 Spark 语句。因此,我假设它是代表用户导入的,因此在从 Conda 提示符启动后无需显式导入它。from pyspark.sql import SparkSessionpysparkpy39SpyderSpark.cmdpysparkSparkSessionpyspark

尽管知道 SparkSession 需要从 Spyder 中导入很有用,但它并没有回答为什么 1 of 6 的问题 环境变量无法从 Spyder 传播, 即变量 .诚然,它解决了真正的问题 目前对我来说,这是为了让 Spark 从 Spyder 工作,为此我感谢受访者。 我仍然对为什么不传播感兴趣。SpyderSpark.cmdPYTHONPATHPYTHONPATH

在一个单独但相关的问题上,我发现创建一个快捷方式不会在 桌面。解决方案原来是作为Spyder启动的前缀 带有 start 的命令:SpyderSpark.cmd

set "HADOOP_HOME=%USERPROFILE%\AppData\Local\Hadoop\2.7.1"
set "JAVA_HOME=%USERPROFILE%\anaconda3\envs\py39\Library"
set "SPARK_HOME=%USERPROFILE%\anaconda3\envs\py39\lib\site-packages\pyspark"
set "PYSPARK_DRIVER_PYTHON=Python"
set "PYSPARK_PYTHON=Python"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;%PYTHONPATH%"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python;%PYTHONPATH%"

start "" ^
%USERPROFILE%\anaconda3\pythonw.exe ^
%USERPROFILE%\anaconda3\cwp.py ^
%USERPROFILE%\anaconda3\envs\py39 ^
%USERPROFILE%\anaconda3\envs\py39\pythonw.exe ^
%USERPROFILE%\anaconda3\envs\py39\Scripts\spyder-script.py

理想情况下,所有以 开头的论点都是 用双引号括起来,以防它们扩展为 非字母数字字符。出于某种原因,我不能那样做 而不会招致附件B(下文)中的不正确行为。因此,我没有用双引号来装饰论点。%USERPROFILE%

使用上面修订的SpyderSpark,Windows快捷方式的字段 应包含:Target

%SystemRoot%\System32\cmd.exe /D /C "%USERPROFILE%\anaconda3\envs\py39\bin\SpyderSpark.cmd"

我发现只需复制Spyder快捷方式并修改字段就很方便。为了便于阅读,这里是相同的命令 分为两条物理线(不适用于快捷方式的领域):TargetTarget

%SystemRoot%\System32\cmd.exe /D /C ^
   "%USERPROFILE%\anaconda3\envs\py39\bin\SpyderSpark.cmd"

感谢 Mofi 对改进此后记的建议。

进一步排除故障 2023-09-03

为了进一步解决环境变量传播到 Spyder 的问题,我听从了 Mofi 的建议,修改为使用 面向控制台而不是面向 GUI :PYTHONPATHSpyderSpark.cmdpythonpythonw

set "HADOOP_HOME=%USERPROFILE%\AppData\Local\Hadoop\2.7.1"
set "JAVA_HOME=%USERPROFILE%\anaconda3\envs\py39\Library"
set "SPARK_HOME=%USERPROFILE%\anaconda3\envs\py39\lib\site-packages\pyspark"
set "PYSPARK_DRIVER_PYTHON=Python"
set "PYSPARK_PYTHON=Python"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;%PYTHONPATH%"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python;%PYTHONPATH%"

set PYTHONPATH & REM HHHHHHHHHHHHHHHHH
%USERPROFILE%\anaconda3\python.exe ^
%USERPROFILE%\anaconda3\cwp-debug.py ^
%USERPROFILE%\anaconda3\envs\py39 ^
%USERPROFILE%\anaconda3\envs\py39\python.exe ^
%USERPROFILE%\anaconda3\envs\py39\Scripts\spyder-script.py

从上面可以看出,在Spyder启动命令之前也会显示在屏幕上。此外,还进行了修订 使用修改后的 ,配音 ,其中打印出两次:PYTHONPATHSpyderSpark.cmdcwp.pycwp-debug.pyPYTHONPATH

import os
import sys
import subprocess
from os.path import join, pathsep

from menuinst.knownfolders import FOLDERID, get_folder_path, PathNotFoundException

# call as: python cwp.py PREFIX ARGs...

prefix = sys.argv[1]
args = sys.argv[2:]

new_paths = pathsep.join([prefix,
                         join(prefix, "Library", "mingw-w64", "bin"),
                         join(prefix, "Library", "usr", "bin"),
                         join(prefix, "Library", "bin"),
                         join(prefix, "Scripts")])
print(os.environ["PYTHONPATH"]) ###################
env = os.environ.copy()
env['PATH'] = new_paths + pathsep + env['PATH']
env['CONDA_PREFIX'] = prefix

documents_folder, exception = get_folder_path(FOLDERID.Documents)
if exception:
    documents_folder, exception = get_folder_path(FOLDERID.PublicDocuments)
if not exception:
    os.chdir(documents_folder)
print(env["PYTHONPATH"]) ######################
sys.exit(subprocess.call(args, env=env))

从 CMD 控制台执行时,预期的内容由 在两者处打印出来 中的位置。此外,得到回应 当它被附加到 in 时,到屏幕。我有 将会议记录中的行集中在一起,以便不同的 的回声更容易识别:SpyderSpark.cmdPYTHONPATHSpyderSpark.cmdcwp-debug.pyPYTHONPATHSpyderSpark.cmdPYTHONPATH

C:\Users\User.Name> C:\Users\User.Name\anaconda3\envs\py39\bin\SpyderSpark.cmd

C:\Users\User.Name> set "HADOOP_HOME=C:\Users\User.Name\AppData\Local\Hadoop\2.7.1"
C:\Users\User.Name> set "JAVA_HOME=C:\Users\User.Name\anaconda3\envs\py39\Library"
C:\Users\User.Name> set "SPARK_HOME=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark"
C:\Users\User.Name> set "PYSPARK_DRIVER_PYTHON=Python"
C:\Users\User.Name> set "PYSPARK_PYTHON=Python"
C:\Users\User.Name> set "PYTHONPATH=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;"
C:\Users\User.Name> set "PYTHONPATH=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python;C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;"

C:\Users\User.Name> set PYTHONPATH   & REM HHHHHHHHHHHHHHHHH
PYTHONPATH=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python;C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;

C:\Users\User.Name> C:\Users\User.Name\anaconda3\python.exe C:\Users\User.Name\anaconda3\cwp-debug.py C:\Users\User.Name\anaconda3\envs\py39 C:\Users\User.Name\anaconda3\envs\py39\python.exe C:\Users\User.Name\anaconda3\envs\py39\Scripts\spyder-script.py

C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python;C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;
C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python;C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;

fromIccProfile: failed minimal tag size sanity
C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\paramiko\transport.py:219: CryptographyDeprecationWarning: Blowfish has been deprecated
  "class": algorithms.Blowfish,

C:\Users\User.Name>

关于 和 的最后警告是 无害的。关于警告的解释可以是 找到 这里这里 而警告只是关于弃用。因此,对 和 的修改(以 )并没有揭示为什么无法传播到 Spyder。fromIccProfileBlowfishfromIccProfileBlowfishSpyderSparkcwp.pycwp-debug.pyPYTHONPATH

下一步是检查是否被破坏 by ,这是一个非常短的脚本:PYTHONPATHspyder-script.py

import re
import sys

from spyder.app.start import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

我实际上正在尝试在 Python 上启动,所以我想知道是否 任何人都可以帮助破译这个密码。

进一步排除故障 2023-09-06

Mofi 解释说,上面的正则表达式替换只是从脚本名称中删除了后缀或后缀,这只会影响文件标识 显示在诊断消息中。spyder-script.py-script.py[w].exe

我注意到随后的语句从模块调用。我检查了, 重点放在 .我找到了从中删除路径的预导码代码。我在 Spyder 中确认了这一点:不包含由 . 在运行之前为空,因此没有其他路径可以检查。main()spyder.app.start%USERPROFILE%\anaconda3\envs\py39\Lib\site-packages\spyder\app\start.pymain()PYTHONPATHsys.pathsys.pathPYTHONPATHSpyderSpark.cmdPYTHONPATHSpyderSpark.cmd

至于它的消失,我看不到任何代码可以修改或删除它 变量。但是,这并不重要, as 仅贡献并显式删除了 中的路径。PYTHONPATHstart.pyos.environ['PYTHONPATH']PYTHONPATHsys.pathstart.pyPYTHONPATHsys.path

我缺乏经验来理解为什么要这样做。Spyder 应该提供一个开发 IDE,但如果它删除了 PYTHONPATH 中的路径,它就很难使用。

附件 A:%SPARK_HOME%/conf/spark-defaults.conf

这里,是:%SPARK_HOME%C:%HOMEPATH%\anaconda3\envs\py39\lib\site-packages\pyspark

spark.eventLog.enabled true
spark.eventLog.dir C:\\Users\\User.Name\\anaconda3\\envs\\py39\\PySparkLogs
spark.history.fs.logDirectory C:\\Users\\User.Name\\anaconda3\\envs\\py39\\PySparkLogs
spark.sql.autoBroadcastJoinThreshold -1

附件B:参数被双引号引用时的错误行为startSpyderSpark.cmd

运行时,将显示一个终端控制台,其中包含以下内容 消息:SpyderSpark.cmd

C:\Users\User.Name\Documents\Python Scripts>set "HADOOP_HOME=C:\Users\User.Name\AppData\Local\Hadoop\2.7.1"
C:\Users\User.Name\Documents\Python Scripts>set "JAVA_HOME=C:\Users\User.Name\anaconda3\envs\py39\Library"
C:\Users\User.Name\Documents\Python Scripts>set "SPARK_HOME=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark"
C:\Users\User.Name\Documents\Python Scripts>set "PYSPARK_DRIVER_PYTHON=Python"
C:\Users\User.Name\Documents\Python Scripts>set "PYSPARK_PYTHON=Python"
C:\Users\User.Name\Documents\Python Scripts>set "PYTHONPATH=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;"
C:\Users\User.Name\Documents\Python Scripts>set "PYTHONPATH=C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python;C:\Users\User.Name\anaconda3\envs\py39\lib\site-packages\pyspark\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;"
C:\Users\User.Name\Documents\Python Scripts>start "" "C:\Users\User.Name\anaconda3\pythonw.exe" ^
C:\Users\User.Name\Documents\Python Scripts>"C:\Users\User.Name\anaconda3\cwp.py" "C:\Users\User.Name\anaconda3\envs\py39" ^
[main 2023-09-02T23:29:02.117Z] update#setState idle
[main 2023-09-02T23:29:04.434Z] WSL is not installed, so could not detect WSL profiles

然后出现 VS Code 应用,打开文件(第 2 个 提供给 in 的参数。退出 VS Code 时,以下内容 其他消息将打印到终端控制台,后跟 Spyder应用程序的外观:cwp.pystartSpyderSpark.cmd

[main 2023-09-02T23:29:09.998Z] Extension host with pid 21404 exited with code: 0, signal: unknown.
C:\Users\User.Name\Documents\Python Scripts>"C:\Users\User.Name\anaconda3\envs\py39\pythonw.exe" "C:\Users\User.Name\anaconda3\envs\py39\Scripts\spyder-script.py"

当我退出Spyder时,终端控制台消失了。

2023-09-06 后记:根据 Mofi 的说法,所有这些意外行为的原因是将 Spyder 启动命令错误地解析为多行语句。具体而言,物理行末尾的插入符号表示语句在下一行的延续,并且此插入符号前面不应有空格。相反,语句继续到的下一行物理行应该以空格开头。通过此修复,参数 to 可以被 double=quoted 引用,并且脚本仍以预期的方式启动 Spyder。这是修订后并正常工作:StartSpyderSpark.cmd

set "HADOOP_HOME=%USERPROFILE%\AppData\Local\Hadoop\2.7.1"
set "JAVA_HOME=%USERPROFILE%\anaconda3\envs\py39\Library"
set "SPARK_HOME=%USERPROFILE%\anaconda3\envs\py39\lib\site-packages\pyspark"
set "PYSPARK_DRIVER_PYTHON=Python"
set "PYSPARK_PYTHON=Python"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;%PYTHONPATH%"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python;%PYTHONPATH%"

start ""^
 "%USERPROFILE%\anaconda3\pythonw.exe"^
 "%USERPROFILE%\anaconda3\cwp.py"^
 "%USERPROFILE%\anaconda3\envs\py39"^
 "%USERPROFILE%\anaconda3\envs\py39\pythonw.exe"^
 "%USERPROFILE%\anaconda3\envs\py39\Scripts\spyder-script.py"

除了为了美观,我没有在任何地方看到描述这个处方,以避免在插入符号之前有一个空格,并以空格开始下一行。但是,它有效。在这种特定情况下,需要以空格开头的连续行可能是由于第一个字符是 ,用于分隔文件路径,但不是文件路径的一部分。由于连续行的第一个字符会自动转义,因此我们不希望 the 成为第一个字符,否则它会失去其特殊含义。""

python pyspark cmd 蟒蛇 间谍

评论

0赞 Machavity 9/3/2023
评论已移至聊天室;请不要在此处继续讨论。在下方发表评论之前,请查看评论的目的。不要求澄清或提出改进建议的评论通常属于 Meta Stack Overflow 或 Stack Overflow Chat 中的答案。继续讨论的评论可能会被删除。

答:

1赞 residentcode 9/1/2023 #1

可能需要解决以下几个问题:

1 - 环境变量格式: 在代码中,你使用的是 %HOMEPATH%,而没有用 % 符号将其括起来。它应该是 %HOMEPATH% 才能正确引用主目录。例如,它应该是 ,而不是 。c:%HOMEPATH%\AppData\Local\Hadoop\2.7.1c:\%HOMEPATH%\AppData\Local\Hadoop\2.7.1

2- 设置环境变量: 最好在启动 PySpark 之前设置环境变量,以确保为 PySpark 会话正确配置它们。在示例中,你在运行 pyspark 后设置变量。

3- 导入 SparkSession: 遇到的错误(NameError: name 'SparkSession' is not defined)表示尚未导入 Spark 所需的模块。您需要从脚本开头的 pyspark.sql 模块导入 SparkSession。

# Create and activate the Conda environment
conda create -n py39 python=3.9 anaconda
conda activate py39

# Install necessary packages
conda install openjdk
conda install pyspark

# Set environment variables (adjust paths accordingly)
set "HADOOP_HOME=C:\%HOMEPATH%\AppData\Local\Hadoop\2.7.1"
set "JAVA_HOME=C:\%HOMEPATH%\anaconda3\envs\py39\Library"
set "SPARK_HOME=C:\%HOMEPATH%\anaconda3\envs\py39\lib\site-packages\pyspark"
set "PYSPARK_DRIVER_PYTHON=python"
set "PYSPARK_PYTHON=python"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python\lib\py4j-0.10.9.7-src.zip;%PYTHONPATH%"
set "PYTHONPATH=%SPARK_HOME%\python\lib\site-packages\pyspark\python;%PYTHONPATH%"

# Launch PySpark
pyspark
# Inside the PySpark session
from pyspark.sql import SparkSession

columns = ["language", "users_count"]
data = [("Java", "20000"), ("Python", "100000"), ("Scala", "3000")]

# Create a SparkSession
spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()

# Your Spark code here
# For example, you can create a DataFrame from the data
df = spark.createDataFrame(data, columns)
df.show()

# Don't forget to stop the SparkSession when done
spark.stop()

更正问题并执行以下步骤后,应该能够在 Conda 环境中正确启动 PySpark 会话并与 Spark 组件交互。

评论

0赞 ShadowRanger 9/1/2023
围绕项目 #1 的散文毫无意义。你说他们遗漏了标志,而他们没有,然后默默地添加一个(可能是正确的,也可能是不正确的),而不是改变任何与符号相关的内容。%\ %
0赞 user2153235 9/1/2023
@residentcode:谢谢你的解释。我会回应你列举的观点:(1)这可能是一个错误。我将所有对环境变量的引用都括在 中。(2) 脚本确实在 之前设置了环境变量。问题是 中没有调用。(3)你是对的。我的浏览器没有在教程中显示屏幕截图。我只看到标题“在Spyder IDE上运行的PySpark应用程序”......%myspark.cmdpysparkpysparkSpyderSpark.cmd
0赞 user2153235 9/1/2023
...所以我从这里开始输入代码。切换浏览器后,我可以看到屏幕截图,该命令确实使 Spark 命令可识别。然而,这只是问题的背景,尽管非常重要。问题是为什么 6 个变量中有 1 个没有传播到 Spyder 中。中方对此有何评论?import
1赞 Mofi 9/3/2023
分配给环境变量的目录路径始终以反斜杠开头。不应使用,因为最终导致环境变量扩展后,Windows 文件 IO 函数必须稍后自动更正,很可能多次。最好使用代替或更好,而不是在批处理脚本中使用。HOMEPATHc:\%HOMEPATH%c:\\Users\User.Namec:\Users\User.Name%HOMEDRIVE%%HOMEPATH%C:\%HOMEPATH%%USERPROFILE%%LOCALAPPDATA%C:\%HOMEPATH%\AppData\Local
1赞 user2153235 9/15/2023 #2

2023-09-06 进一步故障排除部分所述 question,则从中删除路径。跟 对 Spyder 进行更多试驾,一个可能的原因变得清晰起来: Spyder维护自己的工具参数(工具-> PYTHONPATH 管理器')。start.pyPYTHONPATHsys.pathPYTHONPATH

此 Q&A 演示如何 添加到执行 Spyder 的 shell 的路径中,最好事先测试它们的存在。 可以编写一个脚本来执行此操作,并通过 Spyder 的 .sys.pathPYTHONPATHTools -> Preferences -> IPython console -> Startup (tab)

我不清楚为什么Spyder被设计成维护自己的,而不是从环境中继承它。 取决于其他 Python 包/模块的设置方式, 随时间逐块变化。管理起来很危险 手动地。PYTHONPATHPYTHONPATH

有趣的是,在 2019 年,Spyder 确实继承了环境,如果设置为(请参阅此 GitHub 错误 票)。在这个 bug 票,它马上就要修复了,所以似乎 修复是使用 Spyder 的 PYTHONPATH 管理器 所有情况。PYTHONPATHTools -> Preferences -> Python interpreter -> Python interpreterDefault (i.e. the same as Spyder's)PYTHONPATH

然而,作为测试,我设置为 ,这是 从 py39 环境的 Conda 提示符发出的路径。经过以下两项测试后,什么都没有 显示自:Python interpreterC:\Users\User.Name\anaconda3\envs\py39\python.exewhere pythonimport os; os.environ.get("PYTHONPATH")

  • exit()从 Spyder 控制台,我猜它会重新启动 python 解释器
  • 退出和重新启动Spyder

与2019年相关的是 请求“避免 使用外部解释器时删除预定义的 PYTHONPATH”。 我对 GitHub 不够熟悉,无法了解发生了什么 请求,所以如果有人可以称量,谢谢!

最后,我还发现,除非你把自定义路径放到PYTHONPATH中,否则它不需要传播到Spyder中。

在发布的问题中,添加到的两个路径分别来自 启动后发布 在。尽管Spyder内部是空的, 我发现这两条路径都包含在 、 或 间接。PYTHONPATHos.environ.get("PYTHONPATH")pysparkmyspark.cmdPYTHONPATHsys.path

两条路径中的第一条是 。如果我尝试添加这个 到 Spyder 的 PYTHONPATH 管理器,它抱怨路径无效。 检查其中的文件并使用 Cygwin 的 on 文件夹会发现这些文件是 解压缩到包文件夹中。如果我 正确理解我对包的解读,包是 可用于 Python,因为已经包含 .为什么从会话中指向 zip 文件, 我不知道。PYTHONPATH%SPARK_HOME%\python\lib\py4j-0.10.9.7-src.zipfind%USERPROFILE%\anaconda3\envs/py39%USERPROFILE%\anaconda3\envs\py39\Lib\site-packages\py4jpy4jsys.cmd%USERPROFILE%\anaconda3\envs\py39\lib\site-packagesPYTHONPATHpyspark

第二条路径是 。这是 已经包含在Spyder中。PYTHONPATH%SPARK_HOME%\pythonsys.path

剩下的一个问题是Spyder启动脚本是否有效 out 将这两个路径添加到,因为事先将它们添加到。我删除了 from 的设置,果然,两条路径是 仍然存在于Spyder中。sys.pathSpyderSpark.cmdPYTHONPATHPYTHONPATHSpyderSpark.cmdsys.path

因此,负责启动 Spyder 的脚本似乎还添加了 不需要 的必要路径。我 怀疑这是因为 Conda 设置了环境与所有 必要的依赖项。sys.pathPYTHONPATH

我还确认了如果之前确实包含自定义路径 到启动 Spyder,他们没有传播到内部 间谍。这仅仅证实了py4j zip 指向的文件 by 也没有传播到 中。 因此,我认为需要使用 Spyder 的 PYTHONPATH 管理器来 自定义路径或将自定义路径添加到使用代码。PYTHONPATHsys.pathPYTHONPATHsys.pathsys.path