13

是否有一种可移植的方式从 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 转换为可执行文件并将其目录添加到系统 PATH 变量中,但找不到使 python 脚本可执行的可移植方式。

编辑

一年后问了之后,我有点不那么菜鸟了,我发现我的问题不是很清楚,也没有多大意义,所以在提出问题后,我会澄清一些事情。

1) 便携。

当我问这个时,我说便携式。但是在这种情况下,便携是什么意思并不清楚,我也没有过多强调。

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

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

2) 可执行

接下来,短语turning run.py into an executable, 不是很清楚。通过我说的Linux策略chmod +x run.py,添加一个shebang #!/usr/bin/env python,并在系统中添加它的目录添加~/long/path/to/PATH环境变量。但这不适用于 Windows,因为 Windows 不支持像 Linux 这样的可执行文件元数据属性,而且 /usr/bin/env 不一定存在于 Windows 中。

3) 扩展

最后,在我的脑海中,我希望有一个解决方案,它不指定运行什么样的文件,这样如果有一天我们决定制作它,比如说,一个 perl 文件,任何接口都不会改变。

因此,写入run.py会很糟糕,因为它会指定文件类型;能写会更好run

4

4 回答 4

19

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

python -m run

以下是有关-m命令行选项的文档:

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

于 2012-04-03T22:28:56.950 回答
6

您可以通过添加使 python 脚本可执行

#!/usr/bin/env python

到文件的开头,并使用chmod +x.

于 2012-04-03T22:25:58.660 回答
4

澄清编辑后回答

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

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

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

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

在窗户上:

  • 创建一个目录并将其添加到 PATH。AFAIK,没有传统的地方,那为什么不C:\bin\~\bin\
  • 添加.PYPATHEXT环境变量,以便 Windows 将具有 python 扩展名的文件识别为可运行文件,而无需您键入扩展名
  • 将 python 文件与python.exe解释器关联(Windows 资源管理器 > 右键单击​​ > 选中“始终使用所选程序”)。python 安装程序上有一个选项可以为您执行此操作。
  • pytest 带有扩展名的符号链接到目录下PATH(使用 Windows Explorer 或mklink name destcmd 中的 Link Shell Extension )

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

于 2013-07-06T08:32:53.270 回答
0
  1. 使 python 文件可执行(如上面所说的“alberge”)
  2. 创建一些目录并将此目录放入您的 PATH 变量中
  3. 在此目录中,创建指向您的 python 脚本的链接
于 2012-04-03T22:34:47.120 回答