在Python distutils中从setup.py中查找脚本目录的正确方法?

7 python distutils setuptools distribute setup.py

我正在分发一个具有以下结构的包:

mymodule:
  mymodule/__init__.py
  mymodule/code.py
  scripts/script1.py
  scripts/script2.py
Run Code Online (Sandbox Code Playgroud)

mymodule的子目录mymodule包含代码和scripts子目录包含的脚本,应该是由用户执行.

在描述包安装时setup.py,我使用:

scripts=['myscripts/script1.py']
Run Code Online (Sandbox Code Playgroud)

指定脚本的位置.在安装过程中,它们通常会进入某个平台/用户特定bin目录.我所拥有的代码mymodule/mymodule需要调用脚本.然后找到这些脚本的完整路径的正确方法是什么?理想情况下,它们应该在用户的路径上,所以如果我想从shell调用它们,我应该能够做到:

os.system('script1.py args')
Run Code Online (Sandbox Code Playgroud)

但我希望通过其绝对路径调用脚本,而不是依赖于平台特定的bin目录PATH,如:

# get the directory where the scripts reside in current installation
scripts_dir = get_scripts_dir()
script1_path = os.path.join(scripts_dir, "script1.py")
os.system("%s args" %(script1_path))
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?谢谢.

编辑删除脚本之外的代码对我来说不是一个实用的解决方案.原因是我将作业分配到一个集群系统,而我通常这样做的方式是这样的:假设你有一组你想要运行的任务.我有一个脚本,它将所有任务作为输入,然后调用另一个脚本,该脚本仅在给定任务上运行.就像是:

main.py:
for task in tasks:
  cmd = "python script.py %s" %(task)
  execute_on_system(cmd)
Run Code Online (Sandbox Code Playgroud)

所以main.py需要知道它在哪里script.py,因为它需要是一个可执行的命令execute_on_system.

Pio*_*ost 3

我认为您应该构建代码,以便不需要从代码中调用脚本。将所需的代码从脚本移至包中,然后您可以从脚本和代码中调用此代码。