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 解释器