如何在不指定完整路径的情况下,便携地运行Python脚本

14

有没有一种便携的方法可以在shell中运行Python脚本而不必写出其完整路径?

例如,在Linux中,我想在我的主目录下执行以下命令:

cd ~

我希望能够运行位于~/long/path/to/run.py的Python脚本,但我希望只需输入

run.py

即可运行。

python run.py

取代

python ~/long/path/to/run.py
我希望有一种类似于PATH变量的搜索路径列表,其中包含多个目录,这样 python run.py 就会在其中一个目录中运行它遇到的第一个run.py。
我考虑将run.py转换为可执行文件,并将其所在目录添加到系统PATH变量中,但找不到使Python脚本可执行的便携式方法。
编辑:
一年后,我更加了解问题,并且意识到我的问题并不是很清楚,也没有太多意义,所以在得到问题点赞后,我将澄清一些事情。
1)便携式。
当我提出这个问题时,我说过便携式。然而,在这种情况下,便携式意味着什么并不清楚,并且我没有给予它太多重视。
- 平台:应在POSIX(Linux、MacOS等)和Windows上工作 - 即使如此,这仍然不太合理,因为Windows使用cmd.exe,而POSIX使用sh,因此每个平台可能会用不同的语法运行命令。因此,假设最具可移植性的是将相同的输入提供给sh和cmd.exe,两者都运行Python脚本。在这种情况下,您可以从ANSI C system函数运行相同的命令,该函数在POSIX上使用sh,在Windows上使用cmd。ANSI C是Windows和POSIX的少数共同之处之一,因此这个问题在这种情况下有些意义。
2)可执行文件
接下来,短语“将run.py转换为可执行文件”不是很清楚。我的意思是指Linux策略chmod + x run.py、添加一个shebang #!/usr/bin/env python,并将其所在目录添加到系统PATH环境变量中。但是,这在Windows上不起作用,因为Windows不支持类似于Linux的可执行文件元数据属性,并且因为/usr/bin/env在Windows上不一定存在。
3)扩展名
最后,我希望有一种解决方案,不指定run是什么类型的文件,因此,如果将来我们决定将其变成Perl文件,接口就不会更改。
因此,写run.py是不好的,因为它将指定文件类型;最好能够只写run。
4个回答

20
如果包含run.py的目录在模块搜索路径上(例如PYTHONPATH环境变量),则可以像这样运行它:
python -m run

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

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


谢谢F.J,这正是我在寻找的,我感觉它比“#!”方法有两个优点:2 - Ciro Santilli OurBigBook.com
抱歉,这是一个半完成的评论...谢谢F.J,这正是我在寻找的,我觉得它比“#!”方法有两个优点:1)不会使脚本混乱;2)不会使全局PATH变量混乱,而是使用更具体的PYTHONPATH。缺点当然是每次都要输入“python -m”,这会占用空间,更糟糕的是,如果你决定将你的Python脚本转换成bash脚本,那么可能需要重写代码。 - Ciro Santilli OurBigBook.com
我尝试了python -m run,但它没有起作用... 我确定run.py在PYTHONPATH中,因为我可以导入它,并且当我执行import sys; print sys.path时它会显示... 我是不是漏掉了什么? - Ciro Santilli OurBigBook.com
@ciro 你看到错误信息了吗?是只有“没有名为run的模块”还是其他什么? - Andrew Clark
被接受是因为它回答了原始问题,包括可移植性要求(这在最初并没有足够强调)。 - Ciro Santilli OurBigBook.com

6
你可以通过添加以下内容使 Python 脚本可执行:
#!/usr/bin/env python

将其添加到文件开头,并使用chmod +x使其可执行。

谢谢alberge,我不确定这是否适用于Windows,但似乎“#!/usr/bin/env python”将被视为注释,并且Python安装程序会自动将运行.py文件与Python解释器关联起来。如果您将.py放在EXTPATH中,那么这特别好,因为您只需键入“run”而不是“run.py”即可运行Python文件,这意味着如果您决定将Python脚本转换为Perl等语言,您无需重写脚本调用。如果有一种简单的方法可以在Linux中运行脚本而不编写扩展名并且不添加#!...就太好了。 - Ciro Santilli OurBigBook.com

4

澄清编辑后的回答

我更喜欢@F.J.提出的方法,因为它不需要用户指定文件类型。请注意,原始问题中没有指定这一点,所以他对原始问题的回答是正确的。

让我们将文件称为pytest.py,以避免与可能存在的run程序冲突。

在POSIX(MacOS,Linux)上执行@Petr所说的操作,该操作基于@alberge所说的:

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

在Windows上:

  • 创建一个目录并将其添加到PATH中。据我所知,没有惯例性的位置,那么为什么不是C:\bin\~\bin\呢?
  • .PY添加到PATHEXT环境变量中,以便Windows将具有python扩展名的文件识别为可运行文件,而无需您键入扩展名
  • 将python文件与python.exe解释器相关联(Windows Explorer右键单击->勾选“始终使用所选程序”). 在python安装程序中有一个选项可以为您执行此操作。
  • 将带有扩展名的pytest符号链接到PATH下的目录中 (在Windows Explorer中使用Link Shell Extension或者cmd中使用mklink name dest命令)

现在,在两个系统中(Linux下的shWindows下的cmd)都可以使用system("pytest");


0
  1. 将Python文件设置为可执行文件(如上所述“alberge”)
  2. 创建一些目录并将此目录放入您的PATH变量中
  3. 在此目录中,创建指向您的Python脚本的链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接