Python在AppleScript中:Automator中subprocess.call与os.system的区别

0 投票
1 回答
931 浏览
提问于 2025-04-17 04:23

我找到了一种解决方法,可以在自动化工具(版本2.1.1,运行在mac os x 10.6.8上)中从一个shell脚本调用python脚本(python 2.6.1)。我遇到的问题是,当我用os.system("mkdir foo")时,它在某种特定情况下可以正常工作,而subprocess.call("mkdir foo") 也能创建目录,但会导致自动化工具报错。

我这个自动化应用的目的是接受一个被拖放到它上的图片。这个自动化应用只有一个动作:'运行shell脚本',代码如下:

for f in "$@"
do
    python dphoto_pythons/uploader.py $f > dphoto_pythons/auto_output.txt
done

$f是被拖放的图片的名字。('运行shell脚本'设置为将输入作为参数传递。)这里有个奇怪的地方:

在'uploader.py'脚本中,我调用了这个:

retcode=call("mkdir " + dir_full, shell=True) # THIS CAUSES A ERROR IN AUTOMATOR
print "***DOESN'T GET HERE WHEN RUN IN AUTOMATOR****"

它能创建目录,但接下来的语句却没有执行。而且自动化工具会弹出一个错误对话框(上面只说让我检查我的脚本)。

相比之下,如果我在终端中'手动'调用uploader.py:

"python uploader.py someimage.jpg"

它就能顺利运行。

经过一番思考后,我尝试把call换成os.system:

os.system("mkdir " + stu_dir_full)
####retcode=call("mkdir " + stu_dir_full, shell=True) #  BUG

这样在自动化工具和终端中都能正常工作。

我感觉我可能忽略了一些明显的东西,因为这个问题实在太奇怪了。不过我还是想把这个情况分享出来。你们有什么想法吗?

-Mel

1 个回答

0

你可以使用 os.mkdir(stu_dir_full) 来创建一个文件夹...

不过,你的 subprocess.call 这一行可能有问题,因为 subprocess.call 需要的是一个列表,而不是一个字符串。你可以试试这样:

retcode = call(["mkdir",dir_full], shell=True)

撰写回答