如何在不指定完整路径的情况下可移植地运行Python脚本
有没有一种可移植的方法可以从shell运行python脚本而不必编写其完整路径 例如,在Linux中,我希望在主目录中如何在不指定完整路径的情况下可移植地运行Python脚本,python,windows,shell,posix,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 我曾考虑
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转换为可执行文件,并将其目录添加到系统路径变量中,但找不到一种使python脚本可执行的可移植方法
编辑
一年后,在问了这个问题之后,我就少了一点noob,我发现我的问题不是很清楚,也没有什么意义,所以在一个问题投票后,我会澄清一些事情
1) 便携式
当我问这个问题时,我说是便携式的。然而,在这种情况下,什么是可移植的手段还不清楚,我也没有给予太多的强调
- 平台:应在POSIX(Linux、MacOS等)和Windows上工作
- 这仍然没有多大意义,因为windows使用
,而POSIX使用cmd.exe
,因此每个人都可以使用不同的语法运行命令。因此,假设最可移植的方法是将相同的输入同时提供给sh
和sh
,在这两种情况下都运行python脚本。在这种情况下,您可以从ANSI Ccmd.exe
函数运行相同的命令,该函数在POSIX上使用system
,在Windows上使用sh
。ANSIC是Windows和POSIX中为数不多的通用工具之一,在这种情况下,这个问题是有意义的cmd
不是很清楚。说到这里,我正在谈论chmod+xrun.py的Linux策略,添加一个shebang#/usr/bin/env python
,并将其目录添加到系统添加~/long/path/to/path环境变量中。但这对windows不起作用,因为windows不支持像Linux这样的可执行文件元数据属性,而且windows中不一定存在/usr/bin/env
3) 延伸
最后,在我的脑海中,我希望找到一种解决方案,它不指定文件运行的类型,因此,如果有一天我们决定将其制作成perl文件,那么任何接口都不会改变
因此,编写run.py
是不好的,因为它会指定文件类型;最好只编写run
您可以通过添加
#!/usr/bin/env python
如果包含run.py
的目录位于模块搜索路径上(例如,PYTHONPATH
环境变量),则应能够按如下方式运行该文件:
python -m run
以下是关于-m
命令行选项的文档:
-m模块名称
搜索指定模块的sys.path
,并将相应的.py
文件作为脚本运行
使python文件可执行(如上所述的“alberge”)
创建一些目录并将此目录放入PATH变量中
在此目录中,创建指向python脚本的链接
在澄清编辑后回答
与@F.J.建议的方法相比,我更喜欢以下方法,因为它不需要用户指定文件类型。请注意,原问题中没有具体说明这一点,因此他对原问题的回答是正确的
让我们调用文件pytest.py
,以避免与可能存在的run
程序冲突
在POSIX(MacOs,linux)上,按照@Petr所说的做,这是基于@alberge所说的:
chmod+x
- 添加shebang
#/usr/bin/env python
- 创建一个目录并将其添加到路径。Linux上通常的位置是:~/bin/对于单个用户,
/usr/local/bin/
对于所有用户
- 符号链接(
cp-s
)使用basenamepytest
而不是pytest.py
在windows上:
- 创建一个目录并将其添加到路径。好吧,这没有常规的地方,为什么不
C:\bin\
和~\bin\
- 将
.PY
添加到PATHEXT
环境变量中,这样Windows就可以将具有python扩展名的文件识别为可运行文件,而无需您键入扩展名
- 将python文件与
python.exe
解释器关联(Windows资源管理器>右键单击>选中“始终使用所选程序”)。python安装程序上有一个选项可以为您执行此操作
- symlink
pytest
带有扩展名进入路径下的目录(使用Windows资源管理器中的链接外壳扩展名或cmd中的mklink name dest
)
现在系统(“pytest”)
应该在两种系统中都能工作(sh
在Linux下,cmd
在Windows下)谢谢F.J,这正是我想要的,我觉得它比“#!”有两个优点方法:2(具体的抱歉,未完成的评论)。。。谢谢F.J,这就是我想要的,我觉得它比“#!”有两个优点方法:1)不要弄乱脚本2)不要弄乱全局路径变量,而是使用更具体的PYTHONPATH。缺点当然是必须一直键入“python-m”,这会占用空间,更糟糕的是,如果有一天你决定将python脚本转换成bash脚本,可能意味着要重写代码。我尝试了python-m run,但没有成功。。。我确信那是一次跑步