Python - 在命令行模块运行期间添加 PYTHONPATH

Posted

技术标签:

【中文标题】Python - 在命令行模块运行期间添加 PYTHONPATH【英文标题】:Python - add PYTHONPATH during command line module run 【发布时间】:2011-06-02 13:55:23 【问题描述】:

我想跑步:

python somescript.py somecommand

但是,当我运行它时,我需要PYTHONPATH 来包含某个目录。我不能只将它添加到我的环境变量中,因为我想要添加的目录会根据我正在运行的项目进行更改。有没有办法在运行脚本时更改PYTHONPATH?注意:我什至没有 PYTHONPATH 变量,所以我不必担心在运行此脚本期间附加它与覆盖它。

【问题讨论】:

【参考方案1】:

适用于 Mac/Linux;

PYTHONPATH=/foo/bar/baz python somescript.py somecommand

对于 Windows,设置包装器 pythonpath.bat

@ECHO OFF
setlocal
set PYTHONPATH=%1
python %2 %3
endlocal

并调用pythonpath.bat 脚本文件之类的;

pythonpath.bat /foo/bar/baz somescript.py somecommand

【讨论】:

@İsmail - 谢谢。但是,在从命令提示符运行脚本时如何做到这一点?我没有运行 Python、导入东西并手动运行它。 在 Mac/Linux 上你会做 PYTHONPATH=/foo/bar python somescript.py somecommand 我尝试了python -c"import sys;sys.path.append('/my/dir')" 然后python myscript.py mycommand,但它显然不会与下一个解释器会话共享路径。啊,刚看到你的下一条评论,现在试试……在WinXP上不行。 Windows 上没有unset 环境变量命令。而是在初始 echo off 之后添加 setlocal,然后在 .bat 脚本结束时会出现隐式 endlocal(并且 PYTHONPATH 将恢复为之前的值)。 在 Windows 上,如果您想追加现有PYTHONPATH 的路径,您可能需要使用set PYTHONPATH=%PYTHONPATH%;%1【参考方案2】:
 import sys
 sys.path.append('your certain directory')

基本上 sys.path 是一个包含所有 python 模块搜索路径的列表。它由解释器初始化。 PYTHONPATH 的内容会自动添加到该列表的末尾。

【讨论】:

或 sys.path.insert(0,'/some/directory') 将其放在路径的前面。这允许您的材料覆盖可能已经在 pythonpath 上的其他内容。 我用这个答案在 pydev-eclipse IDE 之外运行 uninttest。 sys.path.append(r'D:\PyCharmProjects\cheese_shoppe') Windows 中的示例。【参考方案3】:

如果您从符合 POSIX 的 shell 运行命令,例如 bash,您可以像这样设置环境变量:

PYTHONPATH="/path/to" python somescript.py somecommand

如果都在一行,则 PYTHONPATH 环境值仅适用于该命令。

$ echo $PYTHONPATH

$ python -c 'import sys;print("/tmp/pydir" in sys.path)'
False
$ PYTHONPATH=/tmp/pydir python -c 'import sys;print("/tmp/pydir" in sys.path)'
True
$ echo $PYTHONPATH

【讨论】:

正是我想要的,非常感谢。由于某种原因,运行 python -c "import sys; sys.path.insert(0,'my/path'); import mymodule" 不起作用。【参考方案4】:

你可以试试这个在你的脚本中执行一个函数

python -c "import sys; sys.path.append('/your/script/path'); import yourscript; yourscript.yourfunction()"

【讨论】:

【参考方案5】:

您可以将以下代码粘贴到要从中导入的包的__init__.py 中:

import sys
from pathlib import Path


sys.path.insert(0, Path(__file__).parent)

然后您可以像往常一样从该包中导入模块。

import <module_name>

<module_name>.<method_on_module>()
Example:
import algorithms

algorithms.run_algo1()

您的 IDE 可能会在模块名称下划线,但是当您运行 Python 解释程序时,这不会成为问题。

另外,如果你以后需要读取路径,你可以这样做:

DIR_PATH = Path(sys.path[0])

【讨论】:

【参考方案6】:

这是针对窗户的:

例如,我的桌面上有一个名为“mygrapher”的文件夹。在里面,有名为“计算”和“绘图”的文件夹,其中包含我的主文件“grapherMain.py”需要的 Python 文件。此外,“grapherMain.py”存储在“graphing”中。要在不移动文件的情况下运行所有​​内容,我可以制作一个批处理脚本。让我们将此批处理文件称为“rungraph.bat”。

@ECHO OFF
setlocal
set PYTHONPATH=%cd%\grapher;%cd%\calculation
python %cd%\grapher\grapherMain.py
endlocal

此脚本位于“mygrapher”中。要运行一些东西,我会进入我的命令提示符,然后执行:

>cd Desktop\mygrapher (this navigates into the "mygrapher" folder)
>rungraph.bat (this executes the batch file)

【讨论】:

这与@İsmail 'cartman' Dönmez 的回答有何不同?

以上是关于Python - 在命令行模块运行期间添加 PYTHONPATH的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Python 3.8.0 的命令行上运行 python 文件;它改为调用 python 解释器

从命令行运行 python 要求我导入模块

从命令行运行Python文件不会加载模块

如何从命令行调试使用 python -m 运行的 Python 模块?

Python-模块

导入 python 模块以使脚本能够从命令行运行