如何在不指定完整path的情况下运行一个Python脚本

有没有一种可移植的方式来从一个shell中运行一个python脚本而不写它的完整path?

例如在Linux中,我想在我的主目录

cd ~ 

能够运行一个名为run.py的python脚本,就是说〜/ long / path / to / run.py,但是我想通过简单的运行来运行它

 python run.py 

代替

 python ~/long/path/to/run.py 

我希望某种searchpath列表包含几个目录,就像PATHvariables一样,以便python run.py运行在其中一个目录中遇到的第一个run.py。

我已经考虑将run.py转换为可执行文件并将其目录添加到系统PATHvariables中,但找不到可执行python脚本的可移植方式。

编辑

一年后,我问了一下,我是一个小noob,我看到我的问题不是很清楚,没有多less意义,所以在一个问题提出后,我会澄清一些事情。

1)便携式。

当我问到这个时,我说便携式。 然而,在这种情况下,什么便携手段还不清楚,我也不太重视。

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

  • 由于windows使用cmd.exe ,而POSIX使用sh ,所以这仍然没有什么意义,所以每个人都可以用不同的语法来运行命令。 因此,让我们说,最便携的东西可能是将相同的input提供给shcmd.exe ,在这两种情况下运行python脚本。 在这种情况下,可以从ANSI C system函数运行相同的命令,该函数在Windows上使用POSIX和cmd上的sh 。 ANSI C是Windows和POSIX常见的less数几个事情之一,这个问题在这种情况下是有道理的。

2)可执行

接下来, turning run.py into an executable的语句不是很清楚。 通过这个,我正在谈论chmod +x run.py的Linux策略,添加一个shebang #!/usr/bin/env python ,并将其目录添加到系统中添加〜/ long / path / to / PATH环境variables。 但是,这对windows不起作用,因为windows不支持像Linux这样的可执行文件元数据属性,因为/ usr / bin / env不一定在Windows中存在。

3)扩展

最后,在我的脑海中,我希望有一个解决scheme,它不指定什么types的文件运行,所以如果有一天我们决定创build一个perl文件,那么没有接口会改变。

因此,编写run.py会很糟糕,因为它会指定文件types; 能够写出正好run会更好

Solutions Collecting From Web of "如何在不指定完整path的情况下运行一个Python脚本"

如果包含run.py的目录位于模块搜索路径(例如, PYTHONPATH环境变量)上,则应该能够像这样运行它:

 python -m run 

这里是关于-m命令行选项的文档:

-m module-name
搜索命名模块的sys.path ,并将相应的.py文件作为脚本运行。

你可以通过添加一个python脚本来执行

 #!/usr/bin/env python 

到文件的开头,并使用chmod +x来执行它。

澄清编辑后回答

我更喜欢@FJ建议的方法,因为它不需要用户指定文件类型。 请注意,原来的问题没有提到,所以他对原问题的回答是正确的。

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

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

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

在Windows上:

  • 创建一个目录并将其添加到PATH。 AFAIK,没有传统的地方,为什么不是C:\bin\~\bin\
  • .PY添加到PATHEXT环境变量中,这样Windows就可以将Python扩展名为可运行文件的文件识别出来,而无需输入扩展名
  • 将python文件与python.exe解释器相关联(Windows资源管理器>右键单击>选中“始终使用选定的程序”)。 在python安装程序上有一个选项可以为你做到这一点。
  • 将符号链接pytest扩展到PATH下的目录中(使用Windows资源管理器中的链接Shell扩展或cmd中的mklink name dest

现在system( "pytest" ); 应该在两个系统上工作( sh在Linux下, cmd在Windows下)

  1. 使python文件可执行(如上所述的“alberge”)
  2. 创建一个目录并把这个目录放到你的PATH变量中
  3. 在这个目录中,创建到你的Python脚本的链接