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

我想跑步:

python somescript.py somecommand

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

【问题讨论】:

    标签: python 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 的回答有何不同?
        猜你喜欢
        • 2018-06-25
        • 2021-07-17
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        相关资源
        最近更新 更多