如何在开始使用nohup时将参数传递给python脚本
我需要用bash启动一个python脚本,使用nohup传递一个参数,该参数有助于在我导入的脚本中定义一个常量。关于传递args有很多问题,但是我还没有找到一个成功的使用nohup的方法 我的bash脚本的简化版本:如何在开始使用nohup时将参数传递给python脚本,python,bash,nohup,Python,Bash,Nohup,我需要用bash启动一个python脚本,使用nohup传递一个参数,该参数有助于在我导入的脚本中定义一个常量。关于传递args有很多问题,但是我还没有找到一个成功的使用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
#!/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.
坦率地说,由于我将参数传递给script.py,因此我不确定它们是否在导入脚本的范围内。也就是说,当我采取类似的方法而不使用nohup时,它是有效的 一般来说,任何程序的参数向量都从程序本身开始,然后是它的所有参数和选项。根据语言的不同,程序可能是
sys.argv[0]
,argv[0]
,$0
,或者其他什么,但它基本上总是参数#0
其任务是运行另一个程序的每个程序,如nohup
,以及Python解释器本身,通常会删除自身和所有自己的选项,并将命令行的其余部分提供给目标程序
因此,接受一个命令
和零个或多个ARGS
。在该命令中,argv[0]
将是命令本身(在本例中,'/usr/bin/python'
),而argv[1]
和更高版本将是附加参数('/home/path/to/script/script.py'
以及$BUCKET
解析为的任何参数)
接下来,Python接受零个或多个选项、一个脚本以及该脚本的零个或多个参数,并将该脚本及其参数公开为。因此,在脚本中,sys.argv[0]
将是'/home/path/to/script/script.py'
,而sys.argv[1]
将是$BUCKET
解析的任何内容
bash的工作原理与Python类似$1
将是bash包装器脚本的第一个参数($0
将是脚本本身),依此类推。因此,内部Python脚本中的sys.argv[1]
最终将获得传递给bash包装器脚本的第一个参数
导入根本不影响sys.argv
。因此,在config
模块和顶级脚本中,如果import sys
,sys.argv[1]
将保存传递给bash包装器脚本的$1
(在某些平台上,在某些情况下,argv[0]
可能没有完整的路径,甚至可能是空的。但这与此处无关。您关心的是最终的sys.argv[1]
,以及bash
,nohup
和python
都保证不受影响地通过。)
在这里,我使用python3执行train.py文件,然后使用-u忽略缓冲并在运行中显示日志,而不进行存储,使用参数样式指定mydataset\u目录,然后使用model\u output\u目录然后大于symbol(>)
然后日志被存储在输出中。log最后使用(&)符号
终止此过程
ps ax | grep train
然后记下进程ID
sudo kill -9 Process_ID
我觉得奇怪的是,这会奏效sys.argv[0]
是脚本名,不是第一个参数。答案非常清楚。非常感谢。我的错误基本上是不理解脚本是第一个arg。@Brad:啊,也许我可以解释得更好。伙计。但愿我能不止一次投票。非常感谢。非常有用
sudo kill -9 Process_ID