recursive search for python scripts
假设我有以下树:
1 2 3 4 5
| ~/python
├── one
└── toto.py
└── two
└── toto.py |
即使在export PATH=$PATH:~/python之后,我似乎也不能从~以外的任何地方运行python one/toto.py和python two/toto.py。有办法吗?谢谢!
- 它正在从当前目录中查找文件
- 文件"openses"与文件执行不在同一规则集中。要打开一个文件,您至少需要一个类似于~/python/one/toto.py的相对路径。当试图查找可执行文件时,外壳程序本身解析$PATH变量。您可以创建一个Python脚本,将其标记为可执行文件,以尝试为您执行此操作。通过使用os.path.abspath(...)和使用sys.path查找可以导入和"移交"的模块。
- PATH变量只影响shell找到可执行文件的位置,在您的例子中是python。它不影响python查找运行文件的位置。
一种方法是使用PYTHONPATH,而不是PATH。然后,您可以告诉解释器直接运行模块而不是脚本。例如:
1 2 3
| $ export PYTHONPATH=$PYTHONPATH:~/python
$ python -m one.toto
$ python -m two.toto |
注意,我们不包括扩展名,分隔符已经从/改为.,因为我们现在处理的是python模块,而不是文件系统路径。
如评论中所述。
Linux中的$PATH用于查找可执行文件。在这种情况下,这就是Python。找到这个可执行文件后,它将在当前工作目录中"执行",并从那里开始工作。
也就是说,当Python得到参数one/toto.py时,它将从./开始查找文件夹和文件。
您可以创建一个包装脚本,将其放在/usr/bin/mywrap.py下,将其标记为可执行文件并使用for path in sys.path:,然后尝试查找模块并动态导入它并对其进行"移交"。
由于这是一个用于在操作系统中查找二进制文件的shell变量,因此在Python二进制文件中没有遍历$PATH的魔力。与windows中的PATH非常相似,它也用于同样的目的。