如何在不指定完整路径的情况下可移植地运行Python脚本

如何在不指定完整路径的情况下可移植地运行Python脚本,python,windows,shell,posix,Python,Windows,Shell,Posix,有没有一种可移植的方法可以从shell运行python脚本而不必编写其完整路径 例如,在Linux中,我希望在主目录中 cd ~ 为了能够运行一个名为run.py的python脚本,比如说,~/long/path/to/run.py,但我只想通过键入 python run.py 而不是 python ~/long/path/to/run.py 我希望某种搜索路径列表包含几个目录,就像path变量一样,这样python run.py就会运行它在其中一个目录中遇到的第一个run.py 我曾考虑

有没有一种可移植的方法可以从shell运行python脚本而不必编写其完整路径

例如,在Linux中,我希望在主目录中

cd ~
为了能够运行一个名为run.py的python脚本,比如说,~/long/path/to/run.py,但我只想通过键入

python run.py
而不是

python ~/long/path/to/run.py
我希望某种搜索路径列表包含几个目录,就像path变量一样,这样python run.py就会运行它在其中一个目录中遇到的第一个run.py

我曾考虑将run.py转换为可执行文件,并将其目录添加到系统路径变量中,但找不到一种使python脚本可执行的可移植方法

编辑

一年后,在问了这个问题之后,我就少了一点noob,我发现我的问题不是很清楚,也没有什么意义,所以在一个问题投票后,我会澄清一些事情

1) 便携式

当我问这个问题时,我说是便携式的。然而,在这种情况下,什么是可移植的手段还不清楚,我也没有给予太多的强调

  • 平台:应在POSIX(Linux、MacOS等)和Windows上工作

  • 这仍然没有多大意义,因为windows使用
    cmd.exe
    ,而POSIX使用
    sh
    ,因此每个人都可以使用不同的语法运行命令。因此,假设最可移植的方法是将相同的输入同时提供给
    sh
    cmd.exe
    ,在这两种情况下都运行python脚本。在这种情况下,您可以从ANSI C
    system
    函数运行相同的命令,该函数在POSIX上使用
    sh
    ,在Windows上使用
    cmd
    。ANSIC是Windows和POSIX中为数不多的通用工具之一,在这种情况下,这个问题是有意义的

2) 可执行

接下来,将run.py转换为可执行文件的短语
不是很清楚。说到这里,我正在谈论
chmod+xrun.py的Linux策略,添加一个shebang
#/usr/bin/env python
,并将其目录添加到系统添加~/long/path/to/path环境变量中。但这对windows不起作用,因为windows不支持像Linux这样的可执行文件元数据属性,而且windows中不一定存在/usr/bin/env

3) 延伸

最后,在我的脑海中,我希望找到一种解决方案,它不指定文件运行的类型,因此,如果有一天我们决定将其制作成perl文件,那么任何接口都不会改变


因此,编写
run.py
是不好的,因为它会指定文件类型;最好只编写
run

您可以通过添加

#!/usr/bin/env python

如果包含
run.py
的目录位于模块搜索路径上(例如,
PYTHONPATH
环境变量),则应能够按如下方式运行该文件:

python -m run
以下是关于
-m
命令行选项的文档:

-m
模块名称

搜索指定模块的
sys.path
,并将相应的
.py
文件作为脚本运行

  • 使python文件可执行(如上所述的“alberge”)
  • 创建一些目录并将此目录放入PATH变量中
  • 在此目录中,创建指向python脚本的链接

  • 在澄清编辑后回答

    与@F.J.建议的方法相比,我更喜欢以下方法,因为它不需要用户指定文件类型。请注意,原问题中没有具体说明这一点,因此他对原问题的回答是正确的

    让我们调用文件
    pytest.py
    ,以避免与可能存在的
    run
    程序冲突

    在POSIX(MacOs,linux)上,按照@Petr所说的做,这是基于@alberge所说的:

    • chmod+x
    • 添加shebang
      #/usr/bin/env python
    • 创建一个目录并将其添加到路径。Linux上通常的位置是:~/bin/对于单个用户,
      /usr/local/bin/
      对于所有用户
    • 符号链接(
      cp-s
      )使用basename
      pytest
      而不是
      pytest.py
    在windows上:

    • 创建一个目录并将其添加到路径。好吧,这没有常规的地方,为什么不
      C:\bin\
      ~\bin\
    • .PY
      添加到
      PATHEXT
      环境变量中,这样Windows就可以将具有python扩展名的文件识别为可运行文件,而无需您键入扩展名
    • 将python文件与
      python.exe
      解释器关联(Windows资源管理器>右键单击>选中“始终使用所选程序”)。python安装程序上有一个选项可以为您执行此操作
    • symlink
      pytest
      带有扩展名进入
      路径下的目录(使用Windows资源管理器中的链接外壳扩展名或cmd中的
      mklink name dest

    现在
    系统(“pytest”)
    应该在两种系统中都能工作(
    sh
    在Linux下,
    cmd
    在Windows下)

    谢谢F.J,这正是我想要的,我觉得它比“#!”有两个优点方法:2(具体的抱歉,未完成的评论)。。。谢谢F.J,这就是我想要的,我觉得它比“#!”有两个优点方法:1)不要弄乱脚本2)不要弄乱全局路径变量,而是使用更具体的PYTHONPATH。缺点当然是必须一直键入“python-m”,这会占用空间,更糟糕的是,如果有一天你决定将python脚本转换成bash脚本,可能意味着要重写代码。我尝试了python-m run,但没有成功。。。我确信那是一次跑步