我是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的子进程模块时,我发现我仍然不理解某些东西.目前,我试图从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`是否真的有优势?
我有一个很长的单行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)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 …
我知道以前曾问过类似的问题,但它们似乎都是通过重新设计参数的传递方式(即使用列表等)来解决的。
但是,我这里有一个问题,因为我没有这个选项。有一个特定的命令行程序(我使用的是 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\'"),但没有得到任何输出。
我知道这被认为是不好的做法,因为它解释起来不明确,但我没有其他选择。有任何想法吗?
我想删除文件中的所有*.ts.os.remove没用.
这并没有扩大 *
>>> args = ['rm', '*.ts']
>>> p = subprocess.call(args)
rm: *.ts No such file or directory
Run Code Online (Sandbox Code Playgroud) 我有一个基本的批处理文件,它接受用户输入:
@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的子进程运行命令,但无法正常运行。如果我输入外壳:
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)
由于我对此并不陌生,如果这不是最佳做法,请告诉我。
提前致谢。
我有一个带有以下代码的.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经验,可以使用一些帮助.谢谢!
我正在使用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运行,因此代码可以正常工作.
我怎样才能解决这个引号问题?任何帮助将受到高度赞赏.
谢谢
我的输入是
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.system,subprocess它给了我错误。我怎样才能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) 我正在使用 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) 这不起作用,并说没有这样的文件或目录
current_conecctions = subprocess.Popen("netstat -p udp",shell = False, stdout=subprocess.PIPE).stdout.read()
Run Code Online (Sandbox Code Playgroud)
虽然netstat -p udp在终端中完美运行.
我正在尝试通过 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 ×13
subprocess ×10
shell ×5
bash ×2
linux ×2
batch-file ×1
command-line ×1
communicate ×1
netstat ×1
oracle ×1
process ×1
python-3.6 ×1
python-3.x ×1
quotes ×1
raspberry-pi ×1
sqlplus ×1