相关疑难解决方法(0)

如何通过mailx和subprcoess发送邮件?

我是EE,试图编写一个脚本来简化使用Python的文件检查.出于某种原因,我们的IT不会让我访问我们的smtp服务器,并且只允许通过mailx发送邮件.所以,我想过从Python运行mailx并发送它,就像它在我的控制台中工作一样.唉,它给出了一个例外.请参阅下面的Linux日志:

***/depot/Python-3.1.1/bin/python3.1
Python 3.1.1 (r311:74480, Dec  8 2009, 22:48:08) 
[GCC 3.3.3 (SuSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> process=subprocess.Popen('echo "This is a test\nHave a loook see\n" | mailx -s "Test Python" mymail@mycomopany.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/depot/Python-3.1.1/lib/python3.1/subprocess.py", line 646, in __init__
    errread, errwrite)
  File "/depot/Python-3.1.1/lib/python3.1/subprocess.py", line 1146, in _execute_child
    raise child_exception***
Run Code Online (Sandbox Code Playgroud)

我是Python的新手(现在从PERL迁移).有什么想法吗?

python subprocess

4
推荐指数
1
解决办法
9317
查看次数

何时对Python子进程模块使用Shell = True

似乎每当我尝试使用Python的子进程模块时,我发现我仍然不理解某些东西.目前,我试图从Python模块中加入3 mp4文件.

当我尝试

z ='MP4Box -cat test_0.mp4 -cat test_1.mp4 -cat test_2.mp4 -new test_012d.mp4'
subprocess.Popen(z,shell=True)
Run Code Online (Sandbox Code Playgroud)

一切正常.

当我尝试

z = ['MP4Box', '-cat test_0.mp4', '-cat test_1.mp4', '-cat test_2.mp4', '-new test_012d.mp4']
subprocess.Popen(z,shell=False)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Option -cat test_0.mp4 unknown. Please check usage
Run Code Online (Sandbox Code Playgroud)

我认为,因为shell=False我只需要提供一个列表,其中第一个元素是我想要运行的可执行文件,每个后续元素都是该可执行文件的参数.我是否误解了这个信念,或者是否有正确的方法来创建我想要使用的命令?

另外,有没有Shell=True在subprocess.Popen中使用的规则?到目前为止,我真正知道的(?)是"不要这样做 - 你可以将你的代码暴露给Shell注入攻击".为什么要Shell=False避免这个问题?使用'Shell = True`是否真的有优势?

python shell subprocess

4
推荐指数
2
解决办法
8274
查看次数

为什么不在Python的subprocess.Popen中使用`shell = True`?

我有一个很长的单行shell命令可以被Python调用.代码是这样的:

# "first way"
def run_cmd ( command ):
    print "Run: %s" % command
    subprocess.call (command, shell=True)
run_cmd('''sort -n -r -k5 {3} |head -n 500|awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}' > {2}'''.format(top_count,extend/2,mid,summit))
Run Code Online (Sandbox Code Playgroud)

这些代码有效,但总是这样抱怨:

sort: write failed: standard output: Broken pipe
sort: write error
awk: (FILENAME=- FNR=132) fatal: print to "standard output" failed (Broken pipe)
Run Code Online (Sandbox Code Playgroud)

根据之前的回答,我需要使用更长的脚本来完成此操作,例如:

# "second way"
p1 = Popen("sort -n -r -k5 %s"%summit, stdout=PIPE)
p2 = Popen("head -n 500", stdin=p1.stdout, stdout=PIPE)
# and so on ..........
Run Code Online (Sandbox Code Playgroud)

我的问题是:

(1)"第二路"是否比"第一路"慢

(2)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 …

python linux shell subprocess process

3
推荐指数
1
解决办法
4191
查看次数

Python 子进程:无法转义引号

我知道以前曾问过类似的问题,但它们似乎都是通过重新设计参数的传递方式(即使用列表等)来解决的。

但是,我这里有一个问题,因为我没有这个选项。有一个特定的命令行程序(我使用的是 Bash shell),我必须向其传递带引号的字符串。它不能不被引用,也不能有重复的参数,它只能是单引号或双引号。

command -flag 'foo foo1'
Run Code Online (Sandbox Code Playgroud)

我不会用command -flag foo foo1,也不会用command -flag foo -flag foo1。我认为这是命令接收输入方式的疏忽,但我无法控制它。

我传递参数如下:

self.commands = [
                self.path,
                '-flag1', quoted_argument,
                '-flag2', 'test',
                ...etc...
                ]
process = subprocess.Popen(self.commands, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
results = process.communicate(input)
Run Code Online (Sandbox Code Playgroud)

哪里quoted_argument有像“foo foo1 foo2”这样的东西。我尝试转义单引号 ( "\'foo foo1 foo2\'"),但没有得到任何输出。

我知道这被认为是不好的做法,因为它解释起来不明确,但我没有其他选择。有任何想法吗?

python bash shell quotes subprocess

2
推荐指数
1
解决办法
6779
查看次数

Python:子进程调用无法识别*通配符?

我想删除文件中的所有*.ts.os.remove没用.

这并没有扩大 *

>>> args = ['rm', '*.ts']
>>> p = subprocess.call(args)
rm: *.ts No such file or directory
Run Code Online (Sandbox Code Playgroud)

python linux shell subprocess

2
推荐指数
1
解决办法
757
查看次数

将Python变量传递给批处理文件

我有一个基本的批处理文件,它接受用户输入:

@echo off
set /p Thing= Type Something: 
echo %Thing%
pause
Run Code Online (Sandbox Code Playgroud)

但是,我想使用Python编写的变量传递到批处理文件中.让我们说一个字符串'arg1'这只是一个基本的例子,但我仍然无法弄明白.以下代码将运行批处理,但'arg1"没有影响

import subprocess

filepath = r'C:\Users\MattR\Desktop\testing.bat'

subprocess.call([filepath, 'arg1'])
Run Code Online (Sandbox Code Playgroud)

我也试过,p = subprocess.Popen([filepath, 'arg1'])但批处理文件不能在Python中运行.

我搜索过网络,但是没有一个答案似乎对我有用.以下是我也尝试过的一些链接:示例1,示例2.我也尝试过其他人,但他们似乎对用户的需求非常具体.

如何开始将Python变量传递到我的批处理文件中?

python subprocess batch-file python-3.6

2
推荐指数
1
解决办法
4790
查看次数

Python子进程:命令在Python中失败,但在Shell中工作

我试图通过Python的子进程运行命令,但无法正常运行。如果我输入外壳:

pack < packfile.dat
Run Code Online (Sandbox Code Playgroud)

pack我的软件在哪里,又packfile是输入文件,那么软件运行正常。

如果我在python中尝试:

import subprocess as sp
import shlex

cmd = 'pack < packfile.dat'.split()
p = sp.Popen(cmd)
Run Code Online (Sandbox Code Playgroud)

该软件抱怨:

Pack must be run with: pack < inputfile.inp 

Reading input file... (Control-C aborts)
Run Code Online (Sandbox Code Playgroud)

它挂在那里。

最后一部分特定于我的软件,但事实是,运行两种命令的两种方法给出的结果不同,而实际情况并非如此。

谁能告诉我我在做什么错?

实际上,我最终打算这样做:

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE)
stdout, stderr = p.communicate()
Run Code Online (Sandbox Code Playgroud)

由于我对此并不陌生,如果这不是最佳做法,请告诉我。

提前致谢。

python command-line subprocess

1
推荐指数
1
解决办法
750
查看次数

我可以使用SQLPlus来执行.sql文件吗?

我有一个带有以下代码的.sql文件:

delete from stalist
where stalistid=4944
/
insert into stalist
(stalistid, staid)
(select distinct 4944, staid
from staref
Where staid in(
3797,3798,
3870,4459,
3871,3872,
3876,3877,
0
))
/
commit
/
Run Code Online (Sandbox Code Playgroud)

我想使用Python从SQLPlus执行此文件.这可能吗?我在这类工作中没有任何python经验,可以使用一些帮助.谢谢!

python oracle sqlplus

1
推荐指数
1
解决办法
1万
查看次数

为什么在python中的subprocess.check_output()中不允许'(单引号)或"(双引号)?

我正在使用subprocess.check_output()方法从python脚本中执行命令.

有一些命令需要在语法中出现"(双引号).这是一个例子:

>drozer console connect -c "run app.package.info -a com.package.name"
Run Code Online (Sandbox Code Playgroud)

如果我们从上面的命令中删除"(双引号)",它会抛出错误.

我做了以下事情:

string = '\"run app.package.info -a com.package.name\"'
command = ['/usr/bin/drozer','console','connect','-c',string]
output = subprocess.check_output(command)
Run Code Online (Sandbox Code Playgroud)

这让我错误:

*** Unknown syntax: "run app.package.info  -a com.package.name"
Run Code Online (Sandbox Code Playgroud)

请注意:没有引号的命令正在通过subprocess.check_output运行,因此代码可以正常工作.

我怎样才能解决这个引号问题?任何帮助将受到高度赞赏.

谢谢

python subprocess

1
推荐指数
1
解决办法
2180
查看次数

python 中的 sed 命令

我的输入是

Type combinational  function (A B)
Run Code Online (Sandbox Code Playgroud)

想要输出是

Type combinational 
function (A B)
Run Code Online (Sandbox Code Playgroud)

我使用了代码及其工作原理

sed 's/\([^ ]* [^ ]*\) \(function.*\)/\1\n\2/' Input_file
Run Code Online (Sandbox Code Playgroud)

当我在 python 脚本中使用这段代码时os.systemsubprocess它给了我错误。我怎样才能sed在 python 脚本中执行这个。或者我如何为上面的内容编写Python代码sed code。使用的Python代码

cmd='''
sed 's/\([^ ]* [^ ]*\) \(function.*\)/\1\n\2/' Input_file
'''
subprocess.check_output(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)

错误是

sed: -e expression #1, char 34: unterminated `s' command 
Run Code Online (Sandbox Code Playgroud)

python

1
推荐指数
1
解决办法
3753
查看次数

读取输出时Python子进程通信冻结

我正在使用 Gphoto2 在 DSLR 上拍照。由于它基于我尝试使用的 bash 命令,subprocess.communicate但在相机拍照后它会冻结。

如果我gphoto2 --capture-image-and-download在终端中尝试它需要不到 2 秒。我正在研究树莓派。

代码:

import subprocess

class Wrapper(object):

    def __init__(self, subprocess):
        self._subprocess = subprocess

    def call(self,cmd):
        p = self._subprocess.Popen(cmd, shell=True, stdout=self._subprocess.PIPE, stderr=self._subprocess.PIPE)
        out, err = p.communicate()
        return p.returncode, out.rstrip(), err.rstrip()


class Gphoto(Wrapper):
    def __init__(self, subprocess):
        Wrapper.__init__(self,subprocess)
        self._CMD = 'gphoto2'

    def captureImageAndDownload(self):
        code, out, err = self.call(self._CMD + " --capture-image-and-download")
        if code != 0:
            raise Exception(err)
        filename = None
        for line in out.split('\n'):
            if line.startswith('Saving file as '):
                filename …
Run Code Online (Sandbox Code Playgroud)

python subprocess communicate raspberry-pi

0
推荐指数
1
解决办法
3302
查看次数

为什么这个命令在我的终端上工作但在我的代码中不起作用?

这不起作用,并说没有这样的文件或目录

current_conecctions = subprocess.Popen("netstat -p udp",shell = False, stdout=subprocess.PIPE).stdout.read()
Run Code Online (Sandbox Code Playgroud)

虽然netstat -p udp在终端中完美运行.

python shell netstat subprocess

0
推荐指数
1
解决办法
81
查看次数

`参数列表太长:'/bin/sh'`

我正在尝试通过 Python 调用来调用tar 命令。subprocess我面临的挑战是传递了很多文件,tar导致命令抛出错误Argument list too long: '/bin/sh'

我正在运行的命令如下

subprocess.call(f"ulimit -s 99999999; tar -cz -f {output_file} {file_list}", cwd=source_dir, shell=True)
Run Code Online (Sandbox Code Playgroud)

为了尝试克服该错误,我添加了ulimit这似乎没有帮助。我运行的操作系统是 Ubuntu-20.04 & Pyhon 版本是 3.8

请我得到帮助来解决这个问题。

python bash python-3.x

0
推荐指数
1
解决办法
1057
查看次数