使用$ *作为python中os.system的参数的一部分

时间:2016-07-28 08:52:02

标签: python os.system

命令:

make foo -f $*

从命令行调用时与从python脚本调用时具有不同的功能,如下所示:

import os
os.system(make foo -f $*)

如上所述:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF bat文件中的$ *基本上是所有位置参数,看作单个单词。

Python似乎只是将其解析为“$ *”。反正有没有解决这个问题并复制相同的功能?

我意识到我可以编写一个.bat脚本并用python调用它,但我希望能找到更有说服力的东西。

1 个答案:

答案 0 :(得分:1)

正如您所指出的,$ *在python中没有特殊含义。理解完全由您使用的任何外壳完成。如果要将传递给脚本的所有位置参数传递给某个命令,则可以尝试以下

os.system

但请注意,import subprocess, sys subprocess.check_call("make foo -f {}".format(" ".join(sys.argv[1:])), shell=True) 已弃用。你应该使用

shell=True

代替。

修改

正如评论中所建议的那样,只要命令是从"不受信任的"建立的,就应该避免使用import subprocess, sys subprocess.check_call(['make', 'foo', '-f'] + sys.argv[1:]) 。输入,例如程序的命令行。因此,更好的选择是使用

@ViewScoped
@Named
public class Navigation implements Serializable  {

    private List<NavigationItem> navigation = new ArrayList<>();

    public List<NavigationItem> getValues() {
        if (navigation == null || navigation.size() <= 0) {
            NavigationItem navA = new NavigationItem("A", "icon-gauge", "site_a");
            {
                List<NavigationItem> subNav = new ArrayList<>();
                subNav.add(new NavigationItem("1", "", "subsite_1"));
                subNav.add(new NavigationItem("2", "", "subsite_2"));
                subNav.add(new NavigationItem("3", "", "subsite_3"));
                navA.setSubItems(subNav);
            }

            NavigationItem navB = new NavigationItem("B", "icon-layout", "site_b");
            {
                List<NavigationItem> subNav = new ArrayList<>();
                subNav.add(new NavigationItem("4", "", "subsite_4"));
                subNav.add(new NavigationItem("5", "", "subsite_5"));
                navB.setSubItems(subNav);
            }

            NavigationItem navC = new NavigationItem("C", "icon-layout", "site_c");
            {
                List<NavigationItem> subNav = new ArrayList<>();
                subNav.add(new NavigationItem("6", "", "subsite_6"));
                navC.setSubItems(subNav);
            }

            navigation.add(navA);
            navigation.add(navB);
            navigation.add(navC);
            navigation.add(new NavigationItem("Test", "icon-gauge", "site_d"));
        }
        return navigation;
    }

}