关于 python 和 python3 命令的混淆

Amr*_*Deb 1 python python-3.x

我有一个应用程序,我正在尝试使用 Python 使其独立于平台。

我在所有 3 个操作系统(Mac、Win10、Ubuntu)中都安装了 Python 3.x

我有一个 python 脚本 batch.py​​ ,它从自身内部调用其他 python 脚本,如下所示:

import os
import argparse
import shutil

if __name__ == '__main__':
    parser.add_argument("-i", "--infolder", default="./pdfs", 
        help="Input folder with PDFs. Default: ./pdfs")
    args = parser.parse_args()
    infolder =args.infolder
    # Watermarking process    
    watermark_outfolder = tmp+'/pdfs_watermarked'
    if not os.path.exists(watermark_outfolder):
        os.makedirs(watermark_outfolder)
    else:
        for root, dirs, files in os.walk(watermark_outfolder):
            for f in files:
                os.unlink(os.path.join(root, f))
            for d in dirs:
                shutil.rmtree(os.path.join(root, d))
    watermark_command = 'python watermark.py --in '+infolder
    os.system(watermark_command) 
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是在 Linux 中,当我使用os.system('python ...它时脚本不会运行,只有当我以os.system('python3 .... 另一方面,当我在 Win10 中运行它时,它适用于 python 但不适用于 python3。我试图检查 python 版本:

if sys.version_info[0] < 3:
        watermark_command = 'python watermark.py --in '+infolder
    else:
        watermark_command = 'python3 watermark.py --in '+infolder
    os.system(watermark_command)
Run Code Online (Sandbox Code Playgroud)

这样做没有帮助,它不能在 Win10 中运行

Ant*_*ile 6

两件事情:

(1)除非您想注入 shell,否则不要使用os.systemsubprocess.call例如首选)

想象一下,如果您infolder被命名'; touch pwnd'(或更邪恶的东西!)

(2)使用sys.executable代替pythonpython3sys.executable指的是您正在运行的可执行文件

把所有这些放在一起,你会得到这样的东西:

subprocess.call((sys.executable, 'watermark.py', '--in', infolder))
Run Code Online (Sandbox Code Playgroud)