5

我需要使用 bash 启动一个 python 脚本,使用 nohup 传递一个 arg,该 arg 有助于在我导入的脚本中定义一个常量。关于传递参数有很多问题,但我还没有找到使用 nohup 的成功方法。

我的 bash 脚本的简化版本:

#!/bin/bash

BUCKET=$1
echo $BUCKET
script='/home/path/to/script/script.py'
echo "starting $script with nohup"
nohup /usr/bin/python $script $BUCKET &

我正在导入的配置脚本的相关部分:

FLAG = sys.argv[0]
if FLAG == "b1": 
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket1" 
    AWS_SECRET_ACCESS_KEY = "secret"
elif FLAG == "b2": 
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket2"
    AWS_SECRET_ACCESS_KEY = "secret"
else:
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket3"
    AWS_SECRET_ACCESS_KEY = "secret"

使用它的脚本:

from config import BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

#do stuff with the values.  

坦率地说,由于我将 args 传递给 script.py,我不确定它们是否会在导入脚本的范围内。也就是说,当我在不使用 nohup 的情况下采用类似的方法时,它可以工作。

4

2 回答 2

6

一般来说,任何程序的参数向量都从程序本身开始,然后是它的所有参数和选项。根据语言的不同,程序可能是sys.argv[0]argv[0]$0或其他,但它基本上总是参数 #0。

每个程序的工作是运行另一个程序——比如nohup,和 Python 解释器本身一样——通常会丢弃自己和所有自己的选项,并将命令行的其余部分交给目标程序。

因此,nohup需要 aCOMMAND和零或更多ARGS。在里面COMMAND,argv[0]将是COMMAND它自己(在这种情况下,'/usr/bin/python'),argv[1]稍后将是附加参数('/home/path/to/script/script.py'以及任何$BUCKET解析为)。

接下来,Python 采用零个或多个选项、一个脚本和零个或多个 args 到该脚本,并将脚本及其 args 公开为sys.argv. 因此,在您的脚本中,sys.argv[0]将是'/home/path/to/script/script.py',并且sys.argv[1]将是任何$BUCKET解决方案。

并且bash与 Python 类似;$1将是 bash 包装脚本的第一个参数($0将是脚本本身),依此类推。因此,sys.argv[1]在内部 Python 脚本中,最终会将第一个参数传递给 bash 包装器脚本。

导入完全没有影响sys.argv。因此,在您的config模块和顶级脚本中,如果您import syssys.argv[1]保留$1传递给 bash 包装脚本的内容。

(在某些平台上,在某些情况下argv[0]可能没有完整的路径,甚至可能是空的。但这在这里无关紧要。您关心的是最终的sys.argv[1], 和bash, nohup, 并且python都保证通过它而不受影响。 )

于 2013-08-01T22:01:52.277 回答
0
nohup python3 -u ./train.py --dataset dataset_directory/ --model model_output_directory > output.log &

这里我用python3执行train.py文件,然后-u用于忽略缓冲并在不存储的情况下显示日志,用参数样式和model_output_directory指定我的dataset_directory然后大于符号(>)

然后将日志存储在output.log 中,最后使用和(&)符号

终止此过程

ps ax | grep train

然后记下 process_ID

sudo kill -9 Process_ID
于 2020-02-12T19:15:45.547 回答