有没有一种可移植的方式来从一个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提供给sh
和cmd.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
会更好
如果包含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
#!/usr/bin/env python
/usr/local/bin/
用于所有用户 cp -s
)PATH下的文件pytest
而不是pytest.py
在Windows上:
C:\bin\
和~\bin\
? .PY
添加到PATHEXT
环境变量中,这样Windows就可以将Python扩展名为可运行文件的文件识别出来,而无需输入扩展名 python.exe
解释器相关联(Windows资源管理器>右键单击>选中“始终使用选定的程序”)。 在python安装程序上有一个选项可以为你做到这一点。 pytest
扩展到PATH
下的目录中(使用Windows资源管理器中的链接Shell扩展或cmd中的mklink name dest
) 现在system( "pytest" );
应该在两个系统上工作( sh
在Linux下, cmd
在Windows下)