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

时间:2012-04-03 22:21:49

标签: 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。

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

修改

一年后,在询问之后,我的菜鸟少了一点,我看到我的问题不是很清楚,没有多大意义,所以在提出问题之后我会澄清一些事情。

1)便携式。

当我问这个时我说便携式。然而,在这种情况下,便携式手段并不清楚,我并没有过多强调它。

  • 平台:应该适用于POSIX(Linux,MacOS等)和Windows

  • 这仍然没有多大意义,因为Windows使用cmd.exe,而POSIX使用sh,因此每个人都可以使用不同的语法运行命令。因此,让我们说最可能的方法是将相同的输入提供给shcmd.exe,在两种情况下都运行python脚本。在这种情况下,您可以从ANSI C system函数运行相同的命令,该函数在POSIX上使用sh,在Windows上使用cmd。 ANSI C是Windows和POSIX中常见的几件事之一,在这种情况下,这个问题就有了一些意义。

2)可执行

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

3)扩展

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

因此,编写run.py会很糟糕,因为它会指定文件类型;能够只写run

会更好

4 个答案:

答案 0 :(得分:15)

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

python -m run

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

  

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

答案 1 :(得分:5)

您可以通过添加

使python脚本可执行
#!/usr/bin/env python

到文件的开头,并使其chmod +x可执行。

答案 2 :(得分:2)

澄清编辑后回答

我更喜欢@ F.J建议的方法。因为它不要求用户指定文件类型。请注意,原始问题中未指明这一点,因此他对原始问题的回答是正确的。

让我们调用文件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资源管理器中的链接外壳扩展或来自cmd的mklink name dest

现在system( "pytest" );应该适用于两个系统(Linux下的sh,Windows下的cmd

答案 3 :(得分:0)

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